给定两个由数字组成的字符换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'))

python 字符串 加减 python如何字符串相加_逆序