Python.代码无法处理较大的数字,但可以处理较小的数字.为什么



我正试图编写一个函数,将两个数字相加,并以二进制形式返回它们的和。返回的二进制数应为字符串。该代码似乎对较小的数字有效,但对非常大的数字无效。

编辑:

正确答案需要是(对于给定的测试(:1100011000111000010111111001010110001001000111000000001000001100111000

我的代码输出:110001101111000010111111001011110001001000111000000000000000000000000

def add_binary(a,b):
c = a + b
remainder_list = []
remainder = 0
while c >= 2 and isinstance(c,int) == True:
remainder = c % 2
remainder = str(remainder)
remainder_list += remainder
c = c/2
c = int(c)
else:
remainder = 1
remainder = str(remainder)
remainder_list+=remainder
remainder_list =  [ele for ele in reversed(remainder_list)]
remainder_list = ''.join(remainder_list)
return remainder_list

print(add_binary(800998058044843321128,113138032179979557904))

简单错误。您需要使用楼层划分:

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)

编辑:

这是因为当您使用/时,它会将结果变成浮点值。浮点不能覆盖这么多位,所以在第一步它将变成2.285340225562057e+20。使用int后丢失一些数字。

int(c):457068045112411422720

c // 2:457068045112411439516

如果我们使用//,它仍然会保存这些数字。

我不知道你是否想自己转换二进制文件中的数字。但用一个更简单的解决方案做同样事情的另一种方法是这样做:

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

有了这种方式,你就不会有长和内的问题了

最新更新