实现一个函数,将两个数字相加并以二进制形式返回它们的和。转换可以在添加之前或之后进行。
返回的二进制数应为字符串。
示例:(输入1,输入2-->输出(解释))
1,1 -->“10”(十进制1 + 1 = 2或二进制10)
import math
def add_binary(a,b):
n = a + b
binary = ''
while n > 0:
if n <= 1:
binary += '1'
if n > 1:
if n % 2 == 0:
binary += '0'
if n % 2 != 0:
binary += '1'
n = math.floor(n / 2)
return binary[::-1]
没有通过的例子:
add_binary(90496199081781832257222786108, 11950991938878268526568196103)
add_binary(85987079672838407254875, 88106917934426688740141)
add_binary(6923177883455821141397787, 2519224062931874330334785)
那些偷偷溜走的例子:
add_binary(62880022684, 72004557123)
add_binary(74525217235, 594777288464)
add_binary(997659049134380, 757610766652057)
33次通过,但17次失败。我认为这与数字越来越大有关,但这是我能想到的全部。
4条答案
按热度按时间pw9qyyiw1#
因此,只是为了在构建python函数时使用一个简单的解决方案(
bin
转换为二进制,str
转换为字符串,[2:]
在开始时剥离0b)目前你的循环for循环不起作用,因为
n
在while循环中没有改变。如果你把Math.Floor的划分改为
n//2
,似乎也解决了我的问题。可能是一个奇怪的浮点数,不太好用djp7away2#
我可以推荐python
bin
函数吗?它将python integers int转换为二进制(基数为2)字符串。所以你可以这样做:如果你非常需要一个函数,下面可以做:
为了分解它,
bin
将转换为二进制(返回一个字符串,与示例代码相同),但它返回0b10101010...
。然后.lstrip
从开始处删除0b。wooyq4lh3#
简短,甜蜜,简单:
无需删除
0b
前缀::b
说明符以没有前缀的二进制输出。frebpwbc4#
您的实现不适用于大数字的原因是因为floating-point rounding error是由转换精度要求高于二进制编码所允许的数字所产生的。首先出现浮点数转换问题的原因是,在每次迭代中使用真除法运算符(
/
)将数字除以2,这会在执行除法之前先将两个操作数转换为浮点数,这会使大数字丢失信息。您可以通过使用楼层分割运算符(
//
)来解决此问题。也就是说,改变:
收件人:
此外,通过在每次迭代开始时检查n是否> 0,您将错过在n为0时添加输出到开始。相反,在循环结束时执行检查: