std::string是最稳妥的大数加法载体,因其直观可索引、支持push_back、天然匹配字符串输入输出,且避免vector操作易错和__int128跨平台问题。

为什么 std::string 是最稳妥的大数加法载体
因为 C++ 原生整型(long long 等)撑不过 20 位数字,而大数加法本质是「字符串模拟竖式」,不是类型转换问题。用 std::vector<int></int> 存各位数字也行,但增删、进位、反转操作反而容易出错;std::string 直观、可索引、支持 push_back,且输入输出天然匹配。
- 别试图用
__int128或第三方库“绕过”——它不跨平台,GCC 都不一定默认启用 - 输入一定是十进制字符串,别假设前导零已清除;加法前得手动跳过,否则
"00123" + "045"会算错 - 结果字符串最高位可能为
'0'(比如"0"+"0"),需在返回前检查并保留单个'0'
addStrings 函数里进位变量必须初始化为 0
这是最容易漏掉的坑:很多人写成 int carry; 就开始用,结果未定义行为导致偶发错误。进位只依赖上一位计算,不能靠“上一轮残留”,每次循环都得从干净的 0 开始。
- 每位相加逻辑固定:
digit1 + digit2 + carry,然后sum % 10得当前位,sum / 10得新carry - 两个字符串长度不等时,短的那个对应位按 0 处理,别用
at()硬访问——越界抛异常,改用下标[i]+ 边界判断 - 循环结束后,如果
carry == 1,必须额外push_back('1'),否则"999"+"1"会变成"000"
反向遍历比正向拼接更安全
从低位(字符串末尾)往高位(开头)算,每算一位就 push_back 到结果 std::string,最后再 reverse。比“正向构造字符串 + 每次 insert(0, 1, c)”快得多——后者每次插入都是 O(n) 时间,整体退化成 O(n²)。
- 索引计算:设
i = a.size() - 1 - idx,而不是边跑边--i,避免无符号整型下溢(size_t减到 -1 变成极大正数) - 别用
+=拼接单字符,它隐式调用append,没问题;但别写res = c + res,那是 O(n) 拷贝 -
std::string的reserve()可提前分配空间(比如max(a.size(), b.size()) + 1),避免多次扩容
边界测试必须覆盖这 4 种情况
光测 "123"+"456" 没用。真正暴露问题的是这些:
立即学习“C++免费学习笔记(深入)”;
-
"0" + "0"→ 必须返回"0",不是空串或多个'0' -
"999" + "1"→ 进位贯穿全程,结果长度比两者都长 -
"123" + "0045"→ 输入含前导零,要忽略,但不能直接stoi转(会溢出) -
"1" + ""或空输入 → 生产代码得判空,返回另一方;题目若保证非空,也要心里有数
大数加法真正的复杂点不在算法本身,而在对输入鲁棒性的处理——比如前导零怎么跳、空字符串怎么兜底、进位变量生命周期怎么管。写完别急着交,先拿这四组输进去跑一遍。










