高精度的加法计算(大数加法)
加法
- 基本原理:模拟小学时候的加法计算
- 从低位依次往高位进行加法操作
- 我们在存储数字的时候选择vector容器,尾插法,倒序存储方便计算
如图所示
解释
-
3+8>9
用变量存储11
然后将11%10
存入容器,此时变量/=10
-
变量 = 2+2+变量
,再将5%10
存入容器,此时变量/=10
-
注意此时下面一位数字没有数字可以加了,故不进行运算
-
变量 = 1 + 变量
,最后变量%10
存入容器,再次变量/=10
-
很重要的一点来了,最后结束的时候要判断最高位是否有进位
-
假设最后是
1+9
我们把10%10
存入容器,但并没有向前进位,故需要在最后进行判断 -
此时整个加法过程结束,但需要注意的是上文提到的变量需要在第一步就进行运算,即
3+8+变量
默认值为0,因为在进行第一步个位+个位
的时候不需要考虑更低位是否有进位,只考虑整数加法不考虑浮点数(小数)
- 需要注意的是,由于数字在输入的时候是字符串所以在存入容器时,进行-'0’即,48,将字符型转换成数值型以正确便计算
- 输出的时候需要以倒序输出,因为最后一位是最高位,我们习惯的阅读方式是,高位在前,低位在后
- 存储的时候是低位在前,高位在后
代码
#include <iostream>
#include <vector>
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 != 0) {
C.push_back(t);
}
return C;
}
int main() {
string a, b;
cin >> a >> b;
vector<int> A;
// 将A字符串逆序读入容器
for (int i = a.size() - 1; i >= 0; --i) {
A.push_back(a[i] - '0');
}
vector<int> B;
// 将B字符串逆序读入容器
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;
}