高精度
C++ 本身自带的数字类型无法解决特别大的数的运算,会出现溢出的情况,这时候我们就需要一些算法来模拟大数的运算过程,从而得到最终的结果。
接下来我将带领大家学会高精度的加减乘除运算,这样以后再遇到类似问题就不用再怕啦!
高精度加法
前提条件:给定两个正整数(不含前导0)
不知道大家是否记得小学学的加法运算,把需要运算的两个数列出来,运算过程中可能会出现进位的情况,举个例子,我们来计算一下 48673 和 93146 的和:
动手计算其实很简单,但是如果要用程序实现出来就有点难了,直接上步骤:
1.首先我们在输入时就不能用整型类型输入,而是用字符串类型。
2.然后将字符串中的字符转换成数字传入数组当中( vector 作为数组),这样我们就得到了两个数组 A 和 B,注意我们传入数组时,不能按照字符串下标从低到高的顺序传入,而是反过来,将数字的最低位放到数组中下标的最低位,还是拿上面的那个例子举例。
3.然后开始模拟两个数的加法运算,这里我们需要用到一个附加位 t 来记录每一位上的和,从而解决进位的问题,并且用一个新的数组 C 来接收计算结果,还是上面的例子。
可以发现,第一位上的和没有大于 10,所以直接将 t 加入数组 C 中,接下来继续看大于 10 的情况。
这时候我们将 t%10 的结果放入 C 中,然后执行 t/10 并保留至下一次计算,可以发现这样就模拟了进位操作,我们再看下一位,由于 t/10=1 ,故这次计算需要加上这个 1 即 6+1+1=8 ,并放入 C 当中。
第四位运算同理。
最后一位需要额外注意一下,如果运算已经结束,如果 t 不为 0,则需要加到数组后面。
4.最后,我们再将数组 C 倒着输出一遍就得到了最终的运算结果。
#include <bits/stdc++.h> using namespace std; //高精度加法 vector<int> Add(vector<int>& A, vector<int>& B) { vector <int> C; int t = 0; for (int i = 0; i < A.size() || i < B.size(); i++) { if (i < A.size()) t += A[i]; if (i < B.size()) t += B[i]; C.push_back(t % 10); t /= 10; } if (t) C.push_back(t); //加上最高位的进位 return C; } int main() { string a, b; vector<int> A; vector<int> B; cin >> a >> b; //将字符转换成数字 for (int i = a.size() - 1; i >= 0; i--) { A.push_back(a[i] - '0'); } for (int i = b.size() - 1; i >= 0; i--) { B.push_back(b[i] - '0'); } vector<int> C = Add(A, B); for (int i = C.size() - 1; i >= 0; i--) { cout << C[i]; } }