2016-10-09 5 views
1

Мне было поручено написать код, который будет вводить пользовательский ввод и преобразовать число в его двоичное число. До сих пор я написал код, но у меня есть одна проблема. Я должен использовать цикл for и метод quotient-остаток. Когда я выводю остаток (двоичный), он не печатает последнюю цифру.C++ Как преобразовать десятичное число в двоичный?

Вопрос, который я задаю, заключается в следующем: что мне нужно изменить в цикле for for, чтобы он распечатывал последнюю цифру двоичного номера?

int main() 
{ 
    int num; 
    int rem; 

    cout << "Please enter a number: "; 
    cin >> num; 

    for (int i = 0; i <= (num + 1); i++) 
    { 
     num /= 2; 
     rem = num % 2; 
     cout << rem; 
    } 

    _getch(); 
    return 0; 
} 

Любая помощь приветствуется, спасибо!

+4

Возможный дубликат [C++ - десятичное преобразование в двоичное преобразование] (http://stackoverflow.com/questions/22746429/c-decimal-to-binary-converting) –

+0

просто обмениваются обеими командами 'num/= 2;' и 'rem = num% 2;' Вы начинаете с деления числа на 2, и вы теряете последний двоичный номер. – Franck

ответ

1

Вы теряете последнее двоичное число, когда вы начинаете свой алгоритм путем деления num на 2. Для того, чтобы избежать этой проблемы, вы должны обмениваться как команды, так и num /= 2;rem = num % 2;

Вашей петля также перебирает слишком много раз: на самом деле вы можете остановка, когда num == 0. Следующий код не действует для входов, которые < = 0.

int main() 
{ 
    int num; 
    int rem; 

    cout << "Please enter a number: "; 
    cin >> num; 

    while (num != 0) 
    { 
     rem = num % 2; 
     num /= 2; 
     cout << rem; 
    } 
    cout << std::endl; 

    return 0; 
} 

Если вы хотите, чтобы записать его в правильном порядке, вы должны сначала вычислить логарифм вашего номера в базе 2. Следующее решение использует номер index, который начинается с '1' и что есть '0' после того, как:

int main() 
{ 
    int num; 
    int rem; 

    cout << "Please enter a number: "; 
    cin >> num; 

    if (num > 0) { 
     int index = 1; 
     while (index <= num) 
     index *= 2; 
     index /= 2; 

     do { 
     if (num >= index) { 
      cout << '1'; 
      num -= index; 
     } 
     else 
      cout << '0'; 
     index /= 2; 
     } while (index > 0); 
     cout << std::endl; 
    } 
    else 
     cout << '0'; 

    cout << endl; 
    return 0; 
} 
+0

Спасибо! Другой быстрый вопрос: должен ли я хранить результат в массиве и печатать массив назад, чтобы получить правильный двоичный номер? –

+0

Да, это должно сработать. Альтернативой является вычисление журнала в базе 2 и выполнение условных вычитаний до 0. – Franck

+0

@JustinFarr Я обновил ответ, чтобы напечатать результат в правильном порядке без какого-либо массива. – Franck

-1

Идея состоит в использовании математики. Преобразуйте базовое число 10 в базу 2. Другим способом, возможно, является преобразование битов путем тестирования целочисленного значения с степенями от 2 до максимального значения бит для целого. Я также предполагаю, что вы не собираетесь использовать числа с плавающей запятой. Преобразование двоичных значений с плавающей запятой является головной болью.

+3

«Как преобразовать десятичный в двоичный?» Msgstr "Преобразовать десятичный в двоичный." lol –

0

Вы должны изменить свои строки из

num /= 2; 
rem = num % 2; 

к

rem = num % 2; 
num /= 2; 

Это будет печатать двоичное число в обратном порядке. Я бы рекомендовал изменить цикл for на (num> 0) и добавить каждую цифру в массив вместо cout. Распечатайте массив слева направо, чтобы получить правильный двоичный порядок.

Смежные вопросы