高精度加法

你有下大雨去网吧的勇气,却没有下小雨去图书馆的勇气吗

算法思想

使用数组模拟平常我们的竖式计算。例如:

image-20230427202700060

image-20230428202609403

image-20230428203007184

image-20230428203255775

image-20230428203857482

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

vector<int> add(vector<int> A, vector<int> B){
// 为了方便计算,让A中保存较长的数字, B中保存较短的数字
if(B.size() > A.size()) return add(B, A);

// 保存最终的结果
vector<int> C;

// 以 A 为基准,开始按位计算
// 每位的进位
int t = 0;
for(int i = 0; i < A.size(); i++){
t += A[i];
// 如果B位置还没遍历完
if(i < B.size()) t += B[i];
// 9 + 9 = 18, 1 + 2 = 3。取余即可,进位交给 t /= 10 做
C.push_back(t % 10);
// 如果是18, 那么下次t初始值会变成1
t /= 10;
}
// 最终,还需要判断进位上是否还有数
if(t) C.push_back(t);

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');

vector<int> C = add(A, B);

// 输出计算之后的结果
for(int i = C.size() - 1; i >= 0; i--) cout << C[i];

return 0;
}