Професионална програма
Loading...
remote87 avatar remote87 121 Точки

Math For Developers - Exercise, Problem 2

Здравейте, колеги!

 

Може ли да помоля, някой който е присъствал на тази лекция да сподели, как сте решили втория проблем :

искаме да конвертираме 23 в бинари

23/2 = 11 , остатък 1

11/2 = 5, остатък 1

5/2 = 2, остатък 1

2/2 = 1, остатък 0

1/2 = 0, остатък 1

Печатаме 10111.

Цял ден съм се овъртял в някакви странни писания и не мога да изкарам точно това условие, иначе намерих всевъзможни начини за конвертиране :)

0
Programming Basics
RoYaL avatar RoYaL Trainer 6846 Точки
Best Answer

Това с код ли трябва да стане? Дай да видим как се опитваш да го решиш? Ако ползваш оператора % ще ти върне остатъка - може би това търсиш? После принтирането трябва да е наобратно (.Reverse() или for цикъл от String.Length до 0 - евентуално ще трябва да гугълнеш второто).

int x = 22;

String output = "";

output += x % 2; // добавяме към изхода остатъка от делението на 2

x = x / 2; // правим числото да е равно на резултата от цялочисленото деление на 2

// повтаряме операцията докато "x" не стане 0.

1
remote87 avatar remote87 121 Точки

Значи, още повече се обърках, но пък и си поизясних нещо.

До момента мислех така:

using System;


namespace DecimalToBinary
{
    class DecimalToBinary
    {
        static void Main()
        {
            Console.WriteLine("Enter a decimal number:");
            int x = Int32.Parse(Console.ReadLine());
            int y = x / 2;
            int z = x % 2;
            Console.WriteLine("Numbers: {0}, {1}", y, z);
        }
    }
}

 

И тук въртя разни варианти, как да взема остатъка и резултата и да ги използвам докато стигне 0. Пробвах с for, но ми изби грешка. Разиграх и доста други варианти и сега ти ми даде май най-лесния, който няма нищо общо с това, което мъчех до момента :)

Някакви идеи, как може да се довърши по начина, по който съм тръгнал / понеже е доста опростен / и искам да го разбера.

0
RoYaL avatar RoYaL Trainer 6846 Точки

Начинът ти ще работи, но няма да принтира наобратно :)

Вместо да използваш нова променлива, която да ти дава резултата от цялочисленото деление, просто променяй x. Там където казваш "y" да е равно на "x" делено на две, можеш да кажеш на "х" да е равен на "x" делен на две. Тогава ще може да използваш while цикъл (може да се наложи да прочетеш за него), който го пускаш да върти докато "х" е по-голям от 0

int x = 22;

while ( x > 0 )

{

    int z = x % 2;

    x = x / 2;

    Console.WriteLine("Numbers: {0}, {1}", x, z);

}

1
10/08/2015 01:38:10
remote87 avatar remote87 121 Точки

Така, както си го написал не се ли получава безкраен резултат? Извинявай за глупавите въпроси, но тепърва започвам :)

Виж, какво интересно решение намерих, което сега си обяснявам:

{
            Console.WriteLine("Enter a decimal number:");
            int x = Int32.Parse(Console.ReadLine());
            string counter = "";
            while (x >= 1)
            {
                counter = (x % 2) + counter;
                x = x / 2;
            }
            Console.WriteLine(counter);
 }

....което в същност е почти същото като това, което ми каза ти :D

0
10/08/2015 01:44:52
RoYaL avatar RoYaL Trainer 6846 Точки

Безкраен цикъл се получава, защото няма начин да деля х на 2 и да получа 0 или по-малко от 0 (всъщност има, заради цялочислеността):) прави са тези, които си намерил за пример, трябва до по-голямо или равно на 1.

И докато се върти уайл цикълът препендват каквото се е получило от остатъчното деление към "counter", променлива която аз по-рано бях кръстил "output" :)

Успяваш ли да си обясниш логиката?

Нещо от сорта на :

1. Нека "x" бъде 5
2. Нека "резултат" бъде празен низ ( "" )
3. Докато "x" е по-голямо или равно на единица
3.1. Нека към Делението с остатък на "x" добавим досегашната стойност на "резултат" и цялото това го запишем отново в "резултат"
3.2. Нека новата стойност на "x" да бъде резултата от цялочисленото деление на досегашната му стойност с 2.
3.3. Ако новата стойност на Х е по-голяма или равна на единица - Връщаме се на 3.1. :) Ако ли не, приключваме

---

x = 5
counter = ""
Докато x >= 1:
    Итерация 1:
       z = x % 2 = 5 % 2 = 1
       counter = z + counter = "1" + "" = "1"
       x = x / 2 = 5 / 2 = 2

    Итерация 2:
      z = x % 2 = 2 % 2 = 0
      counter = z + counter = "0" + "1" = "01"
      x = x / 2 = 2 / 2 = 1

   Итерация 3:
      z = x % 2 = 1 % 2 = 1
      counter = z + counter = "1" + "01" = "101"
      x = x / 2 = 1 / 2 = 0

   Итерация 4:
       Няма итерация 4. x = 0, което е по-малко 1 и не отговаря на условието "Докато x >= 1"

Принтираме "counter": 101

1
10/08/2015 02:01:51
remote87 avatar remote87 121 Точки

Много много много, ама МНООООГО благодаря за изключителното обяснение!!! Страшно много ми помогна и най-после мога да си легна спокоен, че го разбрах :)

П.С. леле а това е първата тема още :D Да знаеш, че много ще те тормозя след 15.08 като започне курса 

Благодаря ти още веднъж за изчерпателния отговор!

Лека вечер!

0
RoYaL avatar RoYaL Trainer 6846 Точки

Аз за това попитах дали трябва с код да се решат нещата, защото подобна задачка мисля има 2-3 теми напред като стане въпрос за цикли :)

Лека вечер :)

1
remote87 avatar remote87 121 Точки

RoYaL помощ!

Това е, което имам сглобено до момента:

http://pastebin.com/Agqd3eKJ

Сега Е ли е възможно да изведа всички бинари резултати от числата, които съм въвел на един ред и да кажем:

Console.WriteLine("Your whole name in binary system is:");

и с това да се приеме, че кода е приключен?

...или тук вече прекалено много изпреварвам нещата и засега да го оставя така понеже четох за 

string[] ... = new string[3];

string[1] = "";

string[2] = "";

string[3] = "";

Само, че тук трябва да е посочено предварително, какъв ми е стринга, а аз искам потребителя да си го въведе и се овъртолих нещо?!

Какво ще ме посъветваш

0
RoYaL avatar RoYaL Trainer 6846 Точки

Направи си преди for-а една стрингова променлива string allNameInBinary = "" например.

След while цикъла долепи  до каквото има в момента в allNameInBinary, това което е в binary;

Накрая след for цикъла изпринтирай allNameInBinary

Ако въобще те разбирам правилно де? Ако искаш ми обясни с примерен вход и изход?

0
12/08/2015 17:34:42
remote87 avatar remote87 121 Точки

Ами, мисля че ме разбра правилно:

input: Tsenko

output:

The number of the character T according to the ASCII table is: 84

...

Enter your number:

84

The binary output of your number is: 1010100

...

и сега след като имам бинарито на всяко едно число, искам да ги взема и да отпечатам:

output:

Your whole name in binary system is: 1010100 ... ... ... ...

0
RoYaL avatar RoYaL Trainer 6846 Точки

Значи би трябвало да стане така :)

1
remote87 avatar remote87 121 Точки

Ок, стана:

string allNameInBinary = "";
            for (int i = 0; i < name.Length; i++)
            {               
                Console.WriteLine("Enter your number:");
                int number = int.Parse(Console.ReadLine());
                string binary = "";
                while (number >= 1)
                {
                    binary = (number % 2) + binary;
                    number = number / 2;                  
                }
                allNameInBinary = allNameInBinary + " " + binary;
                Console.WriteLine("The binary output of your number is: {0}", binary);               
            }
            Console.WriteLine("Your whole name in binary system is:{0}", allNameInBinary);

 

Всичко е ОК вече и работи супер! Много благодаря още веднъж! :)

0
12/08/2015 18:14:59