给出每一位上的进制数,问两数之和?两数为非负,位数不超过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]) # 逆序输出