给定两个由数字组成的字符换num1和num2,计算它们的和,不能用内置的加法方法。
基本思路就是竖式计算的过程,两种方法,其中涉及一些容易出错的地方,代码中都做了注释。
# 两个字符串(合法的数字字符串)相加,不能用内置库
# 算竖式的思想,个位对齐,相加,并把进位传递到下一位
def add_strings(a,b):
len_a = len(a)
len_b = len(b)
n = max(len_a,len_b)
carry = 0 # 进位标志
res=''
for i in range(n-1,-1,-1): #逆序,即从最低位开始,因此遍历的下标是n-1->0,最后一个-1表示逆序
x='0' if i>len_a-1 else a[i] # 注意python三元表达式的写法,尤其是else后没:
y='0' if i>len_b-1 else b[i]
sum_x_y = (ord(x)-ord('0')) + (ord(y)-ord('0')) # python 不能字符串不能直接相减,需ord转化为ASCII再运算
res = str((sum_x_y+carry)%10) + res
carry = int((sum_x_y+carry)/10)
if carry: #遍历到字符串结束后,还应加上最后一位进位(若不为0)
res = str(carry)+res
return res
#if i > len_a-1:x=0else:x=a[i]
#优化
def add_strings1(a,b):
i = len(a)
j = len(b)
carry = 0 #进位
res = ''
while i>0 or j>0 or carry: # 对于不确定在哪里停止的循环,就用while,用i来控制循环次数
x=a[i-1] if i>0 else '0'
y=b[j-1] if j>0 else '0'
sum_x_y = (ord(x) - ord('0')) + (ord(y) - ord('0'))
res = str((sum_x_y+carry)%10) + res
carry = int((sum_x_y+carry)/10)
i -= 1
j -= 1
return res
if __name__ == '__main__':
print(add_strings('123','456'))
print(add_strings('789', '456'))
print(add_strings('1234567890', '9876543210'))
print(add_strings1('1234567890', '9876543210'))