一、算法介绍
高精度的数据没办法用某一种类型的变量来存,所以只能用数组来存。该算法的思想就是用数组取存高精度的数,然后模拟我们列竖式计算的过程。
举例说明
A
3
A
2
A
1
A
0
B
0
B
2
B
1
B
0
A_3A_2A_1A_0\\ B_0B_2B_1B_0\\
A3A2A1A0B0B2B1B0
对于这样两个数:
- 我们是先从低位开始算,即 A 0 + B 0 A_0+B_0 A0+B0,然后把>10的部分作为结果的当前位,除去个位的部分作为进位 t t t;
- 再计算 A 1 + B 1 A_1+B_1 A1+B1,此时还要加上上一位的进位 t t t;
- 循环进行下去…
为了统一计算过程,第一次计算的时候我们也算上一个进位,并把它初始化为0。
二、代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B) // 加引用相当于取一个别名,可以省去拷贝数组的时间
{
vector<int> C;
int t = 0; // 进位 + A[i] + B[i]
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(1); // 最后还要再判断一次是否有进位
return C;
}
int main()
{
string a, b;
cin >> a >> b;
vector<int> 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'); //
auto C = add(A, B);
for(int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
return 0;
}