#高精度 ## 思路 大家在刷题时,每一看到高精度就会对这道题视而不见,仿佛很难似的(我也是)。但其实高精度就是我们小学二年级学的竖式,只是代码看起来比较长而已。 ### 高精度加法 我们就按照竖式来,各位相加。例如: ``` 2 0 2 3 + 1 9 8 0 ————————————— 3 9 10 3 ``` 但这时我们会发现,$2+8$ 等于的是一个大于等于十的数,而一个数位上根本不可能会有多个数。这时,我们就会“进一”。 ``` 2 0 2 3 + 1 9 8 0 ————————————— 4 0 0 3 ^ ^ ``` 为了方便,我们就先全部直接向加,最后再处理进位。 --- ### 高精度减法 与加法不同,减法是加法的逆运算,当然不能进位,但是我们可以“借位”。 ``` 4 0 0 3 - 1 9 8 0 ————————————— 3 -9 -8 3 ``` 可以看到,有些位置不够减,变成了负数,那么我们就借去左边的数的一份,当成十来使用。 ``` · · 4 0 0 3 - 1 9 8 0 ————————————— 2 0 2 3 // 注意百位,这里是0,已经减去了个一,再借一位应该是9 ``` --- 于是,唯一一篇 python 代码横空出世。~~RE 调了半天。~~ ## 代码 ```python # python 的单行读入需要注意 n = int(input()) t = [0] + list(map(int, input().split())) # 这里先用int的map存下来,再转成list a = [0] + list(map(int, input().split())) # 同理 o = str(input()) b = [0] + list(map(int, input().split())) ans = [] # 先来一个空列表 for i in range(n + 1): # python的下标也是从0开始 ans.append(0) # 不断加入元素 if o == '+': # 先来加法 for i in range(1, n + 1): # 直接相加 ans[i] = a[i] + b[i] for i in range(n, 0, -1): # 处理进位,注意这里反向不遍历0 ans[i - 1] += ans[i] // t[i] # 下一位的进位 ans[i] %= t[i] # 这一位留下来的值 else: for i in range(1, n + 1): # 各位相减 ans[i] = a[i] - b[i] for i in range(n, 0, -1): # 反向处理借位 if ans[i] < 0: # 如果这一位不够 ans[i - 1] -= 1 # 向前一位借一 ans[i] += t[i] # 注意这里要加上当前位的值 for i in range(1, n + 1): print(ans[i], end = ' ') # 遍历输出 ```