Я не получаю ожидаемый результат при вводе 10000 в этом коде. Проблема заключается в преобразовании десятичного числа в двоичное - PullRequest
0 голосов
/ 29 апреля 2020

Я не получаю ожидаемый результат при вводе 10000 в этом коде. Это код
* от десятичного до двоичного * \

#include<iostream>
    using namespace std;

    int main() {
        int N,sum=0,pv=1,r;
        cin>>N;
        while(N>0){
            r=N%2;
            sum= sum + r*pv;
            N=N/2;
            pv=pv*10;
        }
        cout<<sum<<endl;
    }

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вам нужно использовать модификатор типа unsigned long long int, чтобы получить ожидаемый результат. Значение sum превышает предел общего целого числа, каким-либо образом.

Просто измените ваше объявление:

unsigned long long int N, sum = 0, pv, r;

Ваш код с вышеуказанной модификацией:

Вывод:

10000
10011100010000

И вам хорошо go!

1 голос
/ 29 апреля 2020

10000 10 равно 10011100010000 2 . На большинстве архитектур std::numeric_limits<int>::max() - это 2147483647 (10) , поэтому у вас есть целочисленное переполнение при вычислении sum и pv.

Вы можете использовать более широкий тип для вашего переменные, такие как unsigned long long, которые должны быть как минимум 64-битными, но это не решение. Учтите, что 2147483647 10 равно 1111111111111111111111111111111 2 и 11111111111111111111111111111 10 намного больше, чем 18446744073709551615 10 . Вы, кажется, забыли, что N, будучи int, имеет уже двоичное представление. std::cin >> N; уже выполнила десятичное преобразование в двоичное для вас. Все, что вам нужно сделать, это извлечь значения этих битов.

// Calculate the number of bits in a int
unsigned i = sizeof(N) * CHAR_BIT - 1;

// Skip the leading zeroes, if you want 
do
{
    if ( (N >> i) & 1u)
        break;
    --i;
}
while ( i );

// Print the bits, shifting and masking the number
do
{
    std::cout << ((N >> i) & 1u);
}
while ( i-- );
std::cout << '\n';

Попробуйте также с некоторым отрицательным числом, вы, вероятно, заметите, что они внутренне представлены с использованием дополнения до двух .

...