高精度加法就是用来计算两个远远超过long long范围的大整数相加的方法。它的核心思想非常简单:模拟我们手算竖式加法。
加法步骤
假设两个大数 A 和 B 已经转成上述的小端序数组。我们做加法:
- 从
i = 0开始,依次处理每一位。 - 将
A[i] + B[i] + 进位值相加,得到sum。 - 当前结果位 =
sum % 10,新的进位 =sum / 10。 - 继续处理下一位,直到两个数的所有位都处理完,并且进位为0为止。
代码实现
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 将字符串转为小端序 vector
vector<int> strToVec(const string &s) {
vector<int> v;
for (int i = s.size() - 1; i >= 0; --i)
v.push_back(s[i] - '0');
return v;
}
// 高精度加法
vector<int> add(const vector<int> &a, const vector<int> &b) {
vector<int> c;
int carry = 0; // 进位
int i = 0;
// 只要还有数没加完或者还有进位,就继续
while (i < a.size() || i < b.size() || carry) {
int sum = carry;
if (i < a.size()) sum += a[i];
if (i < b.size()) sum += b[i];
c.push_back(sum % 10); // 当前位
carry = sum / 10; // 新的进位
++i;
}
return c;
}
// 输出大数(将小端序转为正常字符串输出)
void printVec(const vector<int> &v) {
for (int i = v.size() - 1; i >= 0; --i)
cout << v[i];
cout << endl;
}
int main() {
string s1, s2;
cin >> s1 >> s2;
vector<int> a = strToVec(s1);
vector<int> b = strToVec(s2);
vector<int> result = add(a, b);
printVec(result);
return 0;
}
注意数据范围,是否存在负数或特殊符号,需要特殊处理。