😍 前言
在实际应用中,语言提供的数据类型的最大值或最小值可能不足以支撑我们所进行的运算,这时会导致数据的溢出,所以我们需要一种算法来保证运算结果的精度。高精度运算就是为了解决这一问题而来的。简单来说,就是将数据的每一位的分开,存放在数组中,通过对数组中的每个位置来进行相应的运算来的得到最终结果。
需要注意的是:
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(); i ++)
{
t += A[i]; // 依次相加
if (i < B.size()) // 防止越界
t += B

本文详细介绍了如何实现高精度加法、减法、乘法和除法算法,包括操作步骤和代码模板。高精度算法解决了数据溢出问题,通过存储数据到数组并逐一运算来保证精度。加法和乘法中,大数通常放前,小数放后,以简化进位和借位操作。减法和除法同样考虑了顺序和可能的借位。所有运算结束后,可能需要处理前导0。
最低0.47元/天 解锁文章
383

被折叠的 条评论
为什么被折叠?



