Python. Код не работает с большими числами, но работает с меньшими числами. Почему? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь написать функцию, которая складывает два числа вместе и возвращает их сумму в двоичном виде. Возвращаемое двоичное число должно быть строкой. Код, кажется, работает с меньшими числами, но терпит неудачу с очень большими числами.

Изменить:

Правильный ответ должен быть (для данного теста): 110001100011100010111111001010110000100100011100000010010001110000001000001100111000

Выводы моего кода: 110001100011100010111111001010110000 * 100000000000000000000000001

Ответы [ 3 ]

0 голосов
/ 09 апреля 2020

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

>>> def add_binarys(a,b):
...     return str(bin(a+b))
... 
>>> add_binarys(2,4)
'0b110'
>>> add_binarys(800998058044843321128,113138032179979557904)
'0b1100011000111000101111110010101100001001000111000000001000001100111000'
>>> 

Таким образом у вас не будет проблем с long и int.

0 голосов
/ 09 апреля 2020

Простая ошибка. Вам нужно использовать разделение по этажам:

c = c // 2

Это исправит это. Оригинальный c = c/2 превращает ваш c в float, который не подходит для больших чисел Сравните:

>>> int(914136090224822879032 / 2)
457068045112411422720
>>> 914136090224822879032 // 2
457068045112411439516

С этим изменением вы получите:

>>> add_binary(800998058044843321128,113138032179979557904)
'1100011000111000101111110010101100001001000111000000001000001100111000'

, если вам нужна короткая версия:

def add_binary(a, b):
    return '{:b}'.format(a+b)
0 голосов
/ 09 апреля 2020

РЕДАКТИРОВАТЬ:

Это потому, что когда вы используете /, он превратит результат в плавающее. Число с плавающей запятой не может покрыть столько битов, поэтому на первом шаге оно окажется равным 2.285340225562057e+20. Потеря некоторых цифр после использования int.

int(c): 457068045112411422720

c // 2: 457068045112411439516

Если вместо этого мы используем //, он все равно будет сохранен эти цифры.

...