P4282 [AHOI2008] 计算器 题解

传送门

思路

大家在刷题时,每一看到高精度就会对这道题视而不见,仿佛很难似的(我也是)。但其实高精度就是我们小学二年级学的竖式,只是代码看起来比较长而已。

高精度加法

我们就按照竖式来,各位相加。例如:

  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 的单行读入需要注意
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 = ' ')  # 遍历输出
posted @ 2023-10-15 14:26  haokee  阅读(66)  评论(0)    收藏  举报