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';
Попробуйте также с некоторым отрицательным числом, вы, вероятно, заметите, что они внутренне представлены с использованием дополнения до двух .