

新闻资讯
技术教程不能直接用int或long long做大数加法,因为其位数上限分别为10位和约19位,超限会溢出;必须用字符串模拟竖式加法,从右往左逐位计算并处理进位,最后反转结果。
int 或 long long 做大数加法因为 C++ 内置整型有上限:int 通常最多表示 10 位十进制数,long long 最多约 19 位。一旦输入像 "123456789012345678901234567890" 这样的字符串,就必然溢出。所以必须用字符串存数字,逐位模拟小学竖式加法。
关键在于对齐末位、处理进位、反向拼接结果。不能从左往右加,否则进位会破坏已计算位。
a 和 b 视为“低位在右”,用索引从后往前遍历(i = a.size()-1, j = b.size()-1)a[i] - '0',注意字符转数字要减 '0'
carry 变量记录进位(初始为 0),当前和为 digit_a + digit_b + carry
sum % 10,新进位是 sum / 10
push_back 到临时 string res,最后调用 reverse(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" 相加)。
实际写题或工程中,这几个点常导致 WA 或崩溃:
i 或 j 负值时的越界访问——必须用 (i >= 0) ? ... : 0 形式,不能直接写 a[i]
|| carry,导致最高位进位丢失(例如 "5" + "5" 输出 "0" 而不是 "10")真正难的不是写对一次,而是让代码在所有边界输入下稳定输出——比如 "0" + "0"、"0001" + "2",这些看似简单的情况反而最易暴露逻辑漏洞。