在实际应用中,语言提供的数据类型的最大值或最小值可能不足以支撑我们所进行的运算,这时会导致数据的溢出,所以我们需要一种算法来保证运算结果的精度。高精度运算就是为了解决这一问题而来的。简单来说,就是将数据的每一位的分开,存放在数组中,通过对数组中的每个位置来进行相应的运算来的得到最终结果。
需要注意的是:
1、由于数据过大,所以在进行输入的时候一般用字符串来进行存放
2、在将数据的每一位放进数组中时,最好是反着存放,也就是从前往后,位数依次升高。
以存放753 和 964 为例:
这样存放的好处在于方便进位,当他们需要进位的时,可以直接尾插。如果是正着存放的话每次进位都需要头插,全部数据都要往后挪,过于麻烦。
同样的在读取数据的时候需要从后往前读取,或者数据逆置一下。
两数相加,数据的前后顺序不影响结果。
但是根据手算,如果是小数加大数的话,不方便进位,所以在进行运算前先保证大数在前,小数在后。方便进行进位运算
高精度加法的步骤:
a + b
1、将
a 和 b
每一位的数据存放分开在数组A 和 B
中(A.size >= B.size
)
2、用
t
来保存上一位进位的结果
3、从前往后,同时遍历
A 和 B
,t
分别加上两个数据的低位A[i] 和 B[i]
,得到这一位的运算结果
4、将这一位的结果的个位尾插进数组中保存起来(一次只能去一位数) ———> (
t % 10
)
5、记录这一位的进位结果 ———> (
t / 10
)
6、重复上述步骤,直到
A
遍历完(因为A.size >= B.size
,所以A
结束了,运算也就结束了)
7、最后一次运算可能还需要进位,将
t
中保留的进位结果尾插进数组
A
+ B
—————————
C
// C = A + B, A >= 0, B >= 0, A.size >= B.size
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) // 保证位数大的 + 位数小的
return add(B, A);
vector<int> C; // 保存运算结果
int t = 0; // 保存上一次的进位结果
for (int i = 0; i < A.size