添加程序不起作用

时间:2015-02-04 05:49:12

标签: python binary add turing-machines

我试图在Python中编写一个简单的二进制添加程序(我知道Python已经可以做到了,我只是这样做来实践基本的计算概念)。我让它工作得很好,唯一奇怪的是当其中一个数字比另一个长并且从0开始时,程序不会返回预期的结果:

#Binary Adding Machine
def add(a,b):
    #create empty variables
    result=""
    state=0
    #equalize string lengths
    if a>=b:
        c=a
        b="0"*(len(a)-len(b))+b
    else:
        c=b
        a="0"*(len(b)-len(a))+a
    #add strings together into result, in reverse order
    for i in range(1,(len(c)+1)):
        if state==0:
            if a[-i]==b[-i]=="0":
                result+="0"
                state=0
            elif ((a[-i]=="0" and b[-i]=="1") or (a[-i]=="1" and b[-i]=="0")):
                result+="1"
               state=0
            elif a[-i]==b[-i]=="1":
                result+="0"
                state=1
        elif state==1:
            if a[-i]==b[-i]=="0":
                result+="1"
                state=0
            elif ((a[-i]=="0" and b[-i]=="1") or (a[-i]=="1" and b[-i]=="0")):
                result+="0"
                state=1
            elif a[-i]==b[-i]=="1":
                result+="1"
                state=1
    #add another "1" if final state is 1
    if state==1:
        result+="1"
        state=0
    #reverse string
    return result[::-1]

print(add("110101","1111010"))
print(add("1","100000"))
print(add("1","1"))
print(add("100","100"))
print(add("000100100","100"))
print(add("100100100","100"))

如果您运行该程序,将打印以下数字:

10101111
100001
10
1000
1000
100101000

倒数第二行应该返回000101000,而是返回1000。如果数字从1开始,它可以正常工作,正如我们在最后一行中看到的那样。

任何人都能认识到为什么会这样吗?

非常感谢。

3 个答案:

答案 0 :(得分:2)

更改

if(a >= b) to if(len(a) >= len(b))

你的条件意味着python应该比较ascii值而不是它的长度。如你所知0小于1,在这种特殊情况下它不会给你你所期望的。长度比较是你想要的。

正如Marcin所说,有更好的方法可以做到这一点。

答案 1 :(得分:0)

这不是您问题的直接答案,即您的特定代码无效的原因,而是add函数的替代实现。检查代码的结果或有其他类似问题的人可能对您有用。

def add2(a,b):
    return "{0:010b}".format(int(a,2) + int(b,2))


print(add2("110101","1111010"))
print(add2("1","100000"))
print(add2("1","1"))
print(add2("100","100"))
print(add2("000100100","100"))
print(add2("100100100","100"))

输出结果为:

0010101111
0000100001
0000000010
0000001000
0000101000
0100101000

答案 2 :(得分:0)

def add(a,b):
'''add two binary numbers'''
if len(a) > len(b):
    high =  list(a)
    low  =  list(b)
else:
    high =   list(b)
    low  =   list(a) 
# using integers
low     =   map(int,low)
high    =   map(int,high)
# turn
low.reverse()
high.reverse()    

for x in range(len(low)):
    ''' add one too the longer 'number' in the position x, 
        if the smaller number contains an 1 in the same position
    '''
    if low[x] == 1:
        high[x] += 1
''' if in the bigger number is a two, add 1 to the higher position and set it to zero
    if no higher position exists, create one.
'''
for y in range(len(high)):
    if high[y] > 1:
        try:
            high[y+1] +=1
            high[y]   = 0
        except:
            high.append(1)
            high[y]   = 0
'''turn, make strings and return one string'''
high.reverse()
high = map(str,high)
return ''.join(high)     

如果名称 =='主要':

print(add("110101","1111010"))
print(add("1","100000"))
print(add("1","1"))
print(add("100","100"))
print(add("000100100","100"))
print(add("100100100","100"))