PAT 1074 宇宙无敌加法器 Python版(String的函数)

题意:

给出每一位上的进制数,问两数之和?两数为非负,位数不超过N(位数 N < = 20 N<=20 N<=20

思路:

这个加法很有意思,每一位都对应一个进制,所以在模拟每个数相加时只要div对应的进制就可以啦~
这道题对字符串函数的用法也是比较综合的。

  • 先填充至同一长度zfill()函数
  • rstrip()函数抹去右端多余的0,相应的其实是数字的前导零
  • 逆序输出用切片 setp = -1。也可以用reversed()函数,得到迭代对象,再转化为list再用join()函数连接,这样显得有点麻烦。

在排错时没考虑到两数是非负,相加结果可能为 0 的情况,在使用rstrip()后把全部的 0 都删完了,导致非零返回,所以要特判。

<<------详细解释见下方----->>

输入:
30527
06203
415
输出:
7201

tag = input()  # 每位对应进制数
n = input()
m = input()

l = len(tag)
m = m.zfill(l)  # 填充至同一长度
n = n.zfill(l)

ans = [0 for i in range(l+2)]  # 考虑最高位有进位,所以多填至少 1 位
for i in range(l-1, -1, -1):
    num = int(n[i]) + int(m[i]) + ans[l-1-i]  # 相应位数相加再加进位
    if tag[i] == '0' or tag[i] == 'd':    # 替换 0,'d' 为 10
        a, b = divmod(num, 10)
    else:
         a, b = divmod(num, int(tag[i]))
    ans[l-1-i] = b  # 低位
    ans[l-i] = a    # 进位

ans = [str(i) for i in ans]  # 先把列表的数字转为 字符
ans = ''.join(ans).rstrip('0')   # 掠过右端的 0
if ans == '':        # 特判
    print(0)
else:
    print(ans[::-1])  # 逆序输出

你可能感兴趣的:(Python)