不能直接用int或long long做大整数加法,因其位宽限制导致50位以上数字读入即溢出或截断;须用字符串输入、vector存低位在前的数字、模拟竖式进位计算。

为什么不能直接用 int 或 long long 做大整数加法
因为标准整型有位宽限制:int 通常最多表示 10 位十进制数,long long 一般撑死 19 位。一旦输入是 50 位、100 位的数字(比如 RSA 密钥运算或高精度计费),直接读入就会溢出或截断——不是算错,是根本没存对。
数组处理的核心思路是:把大整数当字符串读进来,每位字符转成数字后存进数组,低位在前(即 a[0] 存个位),模拟手算竖式加法。
- 必须逆序存储:方便进位从
a[0]开始累加,避免每次都在头部插入 - 输入字符串长度可能不等,要对齐补 0,而不是靠索引硬算
- 最终结果可能比两个输入都多一位(比如
999 + 1→1000),数组得预留至少max(len1, len2) + 1空间
怎么用 std::vector<int></int> 实现可变长大整数加法
用 std::vector 比裸数组更安全,自动管理内存,且支持动态 push_back。关键不是“能不能用数组”,而是“怎么组织数据流”。
步骤如下:
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
std::string读入两个数字字符串,检查是否为空或含非法字符(如字母、负号需额外处理) - 遍历字符串,从末尾开始取字符:
s[i] - '0'转为数字,push_back到 vector,实现低位在前 - 设
carry = 0,用i = 0同时遍历两个 vector,直到i超过两者最大长度且carry == 0 - 每轮计算:
sum = a[i] + b[i] + carry;新位为sum % 10,进位为sum / 10 - 结果 vector 仍是低位在前,输出时要倒序遍历
示例片段(不带输入校验):
std::vector<int> add(const std::vector<int>& a, const std::vector<int>& b) {
std::vector<int> res;
int carry = 0;
for (int i = 0; i < a.size() || i < b.size() || carry; ++i) {
int sum = carry;
if (i < a.size()) sum += a[i];
if (i < b.size()) sum += b[i];
res.push_back(sum % 10);
carry = sum / 10;
}
return res;
}常见错误:进位没清空、索引越界、输出顺序反了
这三个问题占初学者调试时间的 80% 以上。
-
carry忘记参与循环终止判断:如果只写i ,但最后 <code>carry == 1,结果就丢了一位 - 直接用
a[i]访问而不检查i :C++ 不做边界检查,会读到随机内存,可能 crash 也可能输出乱码 - 输出时从
res[0]开始打印:得到的是逆序结果(如本该输出123,却输出321)。正确做法是for (int i = res.size()-1; i >= 0; --i) - 忽略全零输入:比如
"0"+"0",若中间逻辑跳过前导零清理,可能输出空字符串或多个0
要不要封装成类?什么时候值得上 std::string 输入/输出接口
如果只是单次加法,函数就够了;但只要涉及减法、乘法、比较或多次调用,立刻封装成类。否则复制粘贴逻辑极易出错。
类的关键设计点:
- 内部仍用
std::vector<int></int>存低位在前的数字,构造函数接受const std::string& - 重载
operator+,复用上面的加法逻辑 - 提供
to_string()方法:处理全零情况(返回"0")、跳过高位冗余零、再倒序拼接 - 不要在类里存原始字符串——它和 vector 表示可能不一致,维护成本高
真正容易被忽略的是:大整数加法本身很快,但频繁构造临时对象、重复分配 vector 内存会拖慢整体性能。如果批量计算,考虑传引用、用移动语义(std::move),或预分配 buffer。

















