这段时间噬月在进行算法的复习和学习!
这篇博客将包括高精度算法。
本篇算法模板来自AcWing的y总。
高精度算法
题目可能出现的需要高精的情况:
$A + B$
$A - B$
$A \times a$
$A \div a$
$A \times B$
$A \div B$
其中$len(A), len(B) \le 10^6, a \le 10^6$
A,B属于大整数。
大整数的存储:
当我们有一个大整数123456789,我们要如何存它?
答:使用数组从低到高位存,亦即是:
数组下标 | 数位
————-|—————
0 | 个位
1 | 十位
… | …
相对低位 | 相对低位
… | …
相对高位 | 相对高位这是因为在进行运算的时候可能进位,对数组来说,在后面插入新数显然比在前面插入要方便得多。
运算:
用代码模拟竖式运算。
模板
高精度加法
1 | // C = A + B, A >= 0, B >= 0 |
解:
1 |
|
注:中规中矩的处理,注意存vector的时候低位在前高位在后,遍历的时候不要搞反了即可。但有一个比较重要的理解点是:t在循环刚刚出现时,角色由进位值转变成了临时运算值,而在运算结果被push进vector之后,角色又转变为进位值了。
高精度减法
1 | // C = A - B, 满足A >= B, A >= 0, B >= 0 |
解:
1 |
|
注:cmp函数是由高位到低位遍历的,写的时候错过,以后记得带上脑子。
高精度乘法
1 | // C = A * b, A >= 0, b > 0 |
解:
1 |
|
注:高精乘法也比较简单,和高精加法基本一致,不过需要处理可能未处理完的进位。此处的题解将处理这个问题的循环和逐位计算乘法的循环写在了一起。
高精度除法
1 | // A / b = C ... r, A >= 0, b > 0 |
1 |
|
注:高精除法比较特殊,从高位到低位进行运算,因此vector里一开始是高位在前低位在后的。但为了统一数据存储样式,需要把vector倒腾一下。去掉前导零就不说了,传统艺能。这个题解也有一个小技巧,把余数用引用传了回来,属于个人觉得应该属于解题讨巧的一种写法。
之后会考虑把高精度算法写成大整数类。