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.
Цял ден съм се овъртял в някакви странни писания и не мога да изкарам точно това условие, иначе намерих всевъзможни начини за конвертиране :)
Значи, още повече се обърках, но пък и си поизясних нещо.
До момента мислех така:
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, но ми изби грешка. Разиграх и доста други варианти и сега ти ми даде май най-лесния, който няма нищо общо с това, което мъчех до момента :)
Някакви идеи, как може да се довърши по начина, по който съм тръгнал / понеже е доста опростен / и искам да го разбера.
Начинът ти ще работи, но няма да принтира наобратно :)
Вместо да използваш нова променлива, която да ти дава резултата от цялочисленото деление, просто променяй 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);
}
Така, както си го написал не се ли получава безкраен резултат? Извинявай за глупавите въпроси, но тепърва започвам :)
Виж, какво интересно решение намерих, което сега си обяснявам:
{
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
Безкраен цикъл се получава, защото няма начин да деля х на 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
Много много много, ама МНООООГО благодаря за изключителното обяснение!!! Страшно много ми помогна и най-после мога да си легна спокоен, че го разбрах :)
П.С. леле а това е първата тема още :D Да знаеш, че много ще те тормозя след 15.08 като започне курса
Благодаря ти още веднъж за изчерпателния отговор!
Лека вечер!
Аз за това попитах дали трябва с код да се решат нещата, защото подобна задачка мисля има 2-3 теми напред като стане въпрос за цикли :)
Лека вечер :)
RoYaL помощ!
Това е, което имам сглобено до момента:
http://pastebin.com/Agqd3eKJ
Сега Е ли е възможно да изведа всички бинари резултати от числата, които съм въвел на един ред и да кажем:
Console.WriteLine("Your whole name in binary system is:");
и с това да се приеме, че кода е приключен?
...или тук вече прекалено много изпреварвам нещата и засега да го оставя така понеже четох за
string[] ... = new string[3];
string[1] = "";
string[2] = "";
string[3] = "";
Само, че тук трябва да е посочено предварително, какъв ми е стринга, а аз искам потребителя да си го въведе и се овъртолих нещо?!
Какво ще ме посъветваш
Направи си преди for-а една стрингова променлива string allNameInBinary = "" например.
След while цикъла долепи до каквото има в момента в allNameInBinary, това което е в binary;
Накрая след for цикъла изпринтирай allNameInBinary
Ако въобще те разбирам правилно де? Ако искаш ми обясни с примерен вход и изход?
Ами, мисля че ме разбра правилно:
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 ... ... ... ...
Значи би трябвало да стане така :)
Ок, стана:
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);
Всичко е ОК вече и работи супер! Много благодаря още веднъж! :)