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 6849 Точки
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 6849 Точки

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

Вместо да използваш нова променлива, която да ти дава резултата от цялочисленото деление, просто променяй 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 6849 Точки

Безкраен цикъл се получава, защото няма начин да деля х на 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 6849 Точки

Аз за това попитах дали трябва с код да се решат нещата, защото подобна задачка мисля има 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 6849 Точки

Направи си преди 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 6849 Точки

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

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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.