我想制作一个二进制计算器,我的减法部分有问题。这是我的代码(我试图改编一个我在本网站上找到的总和)。
maxlen = max(len(s1), len(s2))
s1 = s1.zfill(maxlen)
s2 = s2.zfill(maxlen)
result = ''
carry = 0
i = maxlen - 1
while(i >= 0):
s = int(s1[i]) - int(s2[i])
if s <= 0:
if carry == 0 and s != 0:
carry = 1
result = result + "1"
else:
result = result + "0"
else:
if carry == 1:
result = result + "0"
carry = 0
else:
result = result + "1"
i = i - 1
if carry>0:
result = result + "1"
return result[::-1]
该程序可以正常使用一些二进制减法,但它与其他二进制文件失败。 有人可以帮助我,因为我找不到错误吗?非常感谢。
答案 0 :(得分:1)
简答: s1[i] == s2[i]
和carry == 1
时,您的代码错误。
更长的答案:您应该重新构建代码,以便为s==-1
,s==0
和s==1
分别设置三个案例,然后对其进行分支。每个案例中carry
:
if s == -1: # 0-1
if carry == 0:
...
else:
...
elif s == 0: # 1-1 or 0-0
if carry == 0:
...
else:
...
else: # 1-0
if carry == 0:
...
else:
...
通过这种方式,您可以为每种可能性设置一个单独的块,因此无法像第一次尝试那样忽略案例。
答案 1 :(得分:1)
希望下面的答案有帮助。
def binarySubstration(str1,str2):
if len(str1) == 0:
return
if len(str2) == 0:
return
str1,str2 = normaliseString(str1,str2)
startIdx = 0
endIdx = len(str1) - 1
carry = [0] * len(str1)
result = ''
while endIdx >= startIdx:
x = int(str1[endIdx])
y = int(str2[endIdx])
sub = (carry[endIdx] + x) - y
if sub == -1:
result += '1'
carry[endIdx-1] = -1
elif sub == 1:
result += '1'
elif sub == 0:
result += '0'
else:
raise Exception('Error')
endIdx -= 1
return result[::-1]
标准化字符串
def normaliseString(str1,str2):
diff = abs((len(str1) - len(str2)))
if diff != 0:
if len(str1) < len(str2):
str1 = ('0' * diff) + str1
else:
str2 = ('0' * diff) + str2
return [str1,str2]