我必须编写一个代码,它接受两个输入二进制数字(作为字符串)并使用"小学和#34;添加它们。算法。这就是代码输入和输出应该是这样的:
>>>addBinary("11","1")
'100'
我自己尝试过写一些代码但是我被困了:
def addBinary(s,t, b = 0):
if '' == s or '' == t:
return s + t
if 1 == len(s) or 1 == len(s):
if 0 == b:
if (0 == s[-1] and 1 == t[-1]) or (1 == s[-1]and 0 == t[-1]):
return addBinary(s[:-1],t[:-1]) + '1'
elif 0 == s[-1] and 0 == t[-1]:
return addBinary(s[:-1],t[:-1]) + '0'
else:
return addBinary(s[:-1],t[:-1],1) + '0'
else:
if (0 == s[-1] and 1 == t[-1]) or (1 == s[-1]and 0 == t[-1]):
return addBinary(s[:-1],t[:-1],1) + '0'
elif 0 == s[-1] and 0 == t[-1]:
return addBinary(s[:-1],t[:-1]) + '1'
else:
return addBinary(s[:-1],t[:-1],1) + '0'
当我在字符串中留下1个元素时,我遇到了麻烦。我在创建我的基本案例时遇到了麻烦
PS:我必须为此代码使用递归。我不被允许使用循环。
答案 0 :(得分:1)
一些问题:
s + t
时返回b = 0
,否则返回的值将不正确。s + t
退出的情况。有几种方法可以做到,但这里有一个:
def addBinary(s, t, carry = 0):
if ('' == s or '' == t) and carry == 0:
return s + t
digit = carry
carry = 0
if s != '' and s[-1] == '1':
carry = digit
digit = 1 - digit
if t != '' and t[-1] == '1':
carry += digit
digit = 1 - digit
return addBinary(s[:-1], t[:-1], carry) + str(digit)
请注意digit = 1 - digit
只是将1翻转为0,将0翻转为1的方法。
答案 1 :(得分:0)
def add_binary(A:str,B:str)->str:
result=[]
carry=0
i,j=len(A)-1,len(B)-1 # find the max index of strings
while i>0 or j>0 or carry:
total=carry # total is initially "carry" then we add values
if i>=0:
total+=int(A[i]) # convert the str to int, then add to "total"
i-=1
if j>=0:
total+=int(B[j]) # same as above total operation
j-=1
result.append(str(total%2)) # if total=2, we write 0, if total=1, it is 1, if 0 it is 0
carry=total//2 # if total=2 carry=1, otherwise carry=0
# so far this is the first iteration
return ''.join(reversed(result))
我们这样做 reversed(result)
因为“010101010”,我们从末尾开始求和,并将其推送到数组。所以二进制数字的最后一个元素相加并作为数组的第一个元素推送。这就是我们逆转它的原因。
答案 2 :(得分:-2)
作为旁注,最后两行应该是:
else:
return addBinary(s[:-1],t[:-1],1) + '1'
当长度为1时,您不应该做任何不同的事情。当其中一个长度为零时,您应该做一些不同的事情,并且在这种情况下您需要正确处理进位。 return s + t
为b
时,1
不正确。