在C++里,当参与运算的数字位数超过long long所能表示的范围时,直接使用加号会得到错误结果。此时需要用高精度加法,把数字当作字符串处理,按位计算并维护进位。下面给出常用实现方式。

核心思路
高精度加法的本质是用数组从低位到高位保存每一位数字,然后模仿笔算加法:对应位相加,加上前一位的进位,当前位保留余数,向高位传递商作为新进位。
- 用字符串读入两个大数
- 反转字符串,使个位对应下标0
- 逐位相加并处理进位
- 结果反转后输出,注意去掉前导零
代码模板
以下模板可直接用于练习,支持任意长度的非负整数相加:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// 高精度加法函数,返回结果字符串
string addBigNum(string a, string b) {
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
string res = "";
int carry = 0;
int len = max(a.size(), b.size());
for (int i = 0; i < len; i++) {
int x = (i < a.size()) ? (a[i] - '0') : 0;
int y = (i < b.size()) ? (b[i] - '0') : 0;
int sum = x + y + carry;
res.push_back((sum % 10) + '0');
carry = sum / 10;
}
if (carry > 0) {
res.push_back(carry + '0');
}
reverse(res.begin(), res.end());
// 去除前导零
int start = 0;
while (start < res.size() - 1 && res[start] == '0') {
start++;
}
return res.substr(start);
}
int main() {
string a, b;
cin >> a >> b;
cout << addBigNum(a, b) << endl;
return 0;
}
练习建议
你可以在此模板基础上修改,例如支持负数、实现高精度减法或乘法。写代码时重点理解carry变量的传递逻辑与字符串反转的必要性,这能帮助你牢固掌握大数运算模型。
常见错误
- 忘记处理最后剩余的进位导致最高位丢失
- 没有去除结果中的前导零
- 字符串未反转就直接按下标相加,造成个位高位错位
高精度计算是算法入门的重要一环,熟练后面对大数相关的题目会更从容。