不能直接用int或long long做大数加法,因为其位数上限分别为10位和约19位,超限会溢出;必须用字符串模拟竖式加法,从右往左逐位计算并处理进位,最后反转结果。
为什么不能直接用
或
做大数加法
因为 C++ 内置整型有上限:
通常最多表示 10 位十进制数,
最多约 19 位。一旦输入像
这样的字符串,就必然溢出。所以必须用字符串存数字,逐位模拟小学竖式加法。
字符串从右往左逐位相加的核心逻辑
关键在于对齐末位、处理进位、反向拼接结果。不能从左往右加,否则进位会破坏已计算位。
把两个字符串
和
视为“低位在右”,用索引从后往前遍历(
,
)
每次取当前位数字:
,注意字符转数字要减
维护一个
变量记录进位(初始为 0),当前和为
当前位结果是
,新进位是
把每位结果
到临时
,最后调用
完整可运行的高精度加法函数示例
这个函数能正确处理:不同长度(如
+
)、全零、空串(需额外判空,但题目通常保证非空)、以及最大进位(如多个
相加)。
容易被忽略的边界细节
实际写题或工程中,这几个点常导致 WA 或崩溃:
C函数速查手册(CHM版)
C函数速查手册(CHM版)
下载
立即学习
“
C++免费学习笔记(深入)
”;
没处理
或
负值时的越界访问——必须用
形式,不能直接写
忘记循环条件中的
,导致最高位进位丢失(例如
+
输出
而不是
)
结果字符串未反转,输出是倒序的
输入含前导空格或负号?本算法只适用于非负整数字符串;若要支持负数,得先解析符号、再分情况调用加/减逻辑
真正难的不是写对一次,而是让代码在所有边界输入下稳定输出——比如
+
、
+
,这些看似简单的情况反而最易暴露逻辑漏洞。
intlong longintlong long"123456789012345678901234567890"abi = a.size()-1j = b.size()-1a[i] - '0''0'carrydigit_a + digit_b + carrysum % 10sum / 10push_backstring resreverse(res.begin(), res.end())string addStrings(string a, string b) {
string res;
int i = a.size() - 1, j = b.size() - 1;
int carry = 0;
while (i >= 0 || j >= 0 || carry) {
int digit_a = (i >= 0) ? a[i--] - '0' : 0;
int digit_b = (j >= 0) ? b[j--] - '0' : 0;
int sum = digit_a + digit_b + carry;
res.push_back('0' + (sum % 10));
carry = sum / 10;
}
reverse(res.begin(), res.end());
return res;
}"99""1""9"ij(i >= 0) ? ... : 0a[i]|| carry"5""5""0""10""0""0""0001""2"