python-3.x 二进制加法不能通过所有测试

u0njafvf  于 8个月前  发布在  Python
关注(0)|答案(4)|浏览(83)

实现一个函数,将两个数字相加并以二进制形式返回它们的和。转换可以在添加之前或之后进行。
返回的二进制数应为字符串。
示例:(输入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次失败。我认为这与数字越来越大有关,但这是我能想到的全部。

pw9qyyiw

pw9qyyiw1#

因此,只是为了在构建python函数时使用一个简单的解决方案(bin转换为二进制,str转换为字符串,[2:]在开始时剥离0b)

def add_binary(a,b):
    return str(bin(a+b))[2:]

目前你的循环for循环不起作用,因为n在while循环中没有改变。
如果你把Math.Floor的划分改为n//2,似乎也解决了我的问题。可能是一个奇怪的浮点数,不太好用

djp7away

djp7away2#

我可以推荐python bin函数吗?它将python integers int转换为二进制(基数为2)字符串。所以你可以这样做:

number1 = 30 # fill in this value
number2 = 20 # fill in this value
output=bin(number1+number2).lstrip("0b")

如果你非常需要一个函数,下面可以做:

add_binary = lambda a, b: bin(a+b).lstrip("0b")
def add_binary(a: int, b: int) -> str: return bin(a+b).lstrip("0b")

为了分解它,bin将转换为二进制(返回一个字符串,与示例代码相同),但它返回0b10101010...。然后.lstrip从开始处删除0b。

wooyq4lh

wooyq4lh3#

简短,甜蜜,简单:

def add_binary(a,b):
    return f"{a+b:b}"

无需删除0b前缀::b说明符以没有前缀的二进制输出。

frebpwbc

frebpwbc4#

您的实现不适用于大数字的原因是因为floating-point rounding error是由转换精度要求高于二进制编码所允许的数字所产生的。首先出现浮点数转换问题的原因是,在每次迭代中使用真除法运算符(/)将数字除以2,这会在执行除法之前先将两个操作数转换为浮点数,这会使大数字丢失信息。
您可以通过使用楼层分割运算符(//)来解决此问题。
也就是说,改变:

n = math.floor(n / 2)

收件人:

n = n // 2

此外,通过在每次迭代开始时检查n是否> 0,您将错过在n为0时添加输出到开始。相反,在循环结束时执行检查:

def add_binary(a, b):
    bits = []
    n = a + b
    while True:
        bits.append(n % 2)
        n //= 2
        if n == 0:
            break
    return ''.join(map(str, reversed(bits)))

相关问题