因为long long仅支持约9×10¹⁸,无法处理上万位运算;vector低位在前便于加减乘进位逻辑统一,避免索引错乱,常见错误包括进位未push_back或初始化方向错误。

为什么不用 long long 而要手写高精度?
因为 long long 最大只能到 2⁶³−1(约 9×10¹⁸),一旦运算涉及上万位数字(比如 RSA 密钥运算、大阶乘、超长斐波那契),就必须自己管理每一位。用 vector<int></int> 存低位在前的十进制数码,是最直观、调试最方便的方式——不是最优,但够用、易改、不易崩。
vector<int></int> 存数字时,为什么低位在前?
加减法从个位开始进位,乘法也是先算个位参与的乘积项。如果 digits[0] 是个位,所有循环都从 i = 0 开始,逻辑干净;反过来存高位在前,每次都要倒着索引,进位处理容易错位。
常见错误现象:add 结果少一位或最后多出 0 —— 很可能是进位没 push_back,或初始化 vector 时反向赋值了。
实操建议:
- 构造函数里用
for (int i = s.size()-1; i >= 0; i--) digits.push_back(s[i]-'0'); - 打印时逆序输出:
for (int i = digits.size()-1; i >= 0; i--) cout - 始终假设
digits.empty()表示 0,避免空 vector 被当成未定义行为
加减法怎么处理长度不等和借位/进位?
别提前对齐长度。直接按最大长度循环,缺位处视为 0;进位用一个 carry 变量贯穿全程,每轮计算 sum = a[i] + b[i] + carry,然后 carry = sum / 10,sum % 10 存结果。
减法同理,但借位是 carry = (digit ,更稳妥做法是统一用补码思想:把减法转成「加负数」,或者直接用 <code>if (a[i] 判断是否需借位。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
关键细节:
- 加法结束后必须检查
carry != 0,并push_back(carry) - 减法后要去前导零:
while (digits.size() > 1 && digits.back() == 0) digits.pop_back();(注意是back(),因为低位在前,高位在后) - 减法结果为负?先做绝对值比较再决定符号,不要边算边记负号——容易漏掉最终符号判断
乘法为什么不能套三层 for?
可以套,但 O(n²) 是底线。三层 for 容易写成 i 和 j 都从 0 开始,却忘了 digits[i] * digits[j] 应该累加到位置 i+j(因为 10ⁱ × 10ʲ = 10ⁱ⁺ʲ)。这才是核心映射关系。
实操建议:
- 结果 vector 长度预分配
a.size() + b.size(),足够装下最大结果 - 主循环:
for (int i = 0; i - 再跑一遍单独的进位处理循环:
for (int i = 0; i - 最后去前导零(同样用
pop_back()直到size()==1 || back()!=0)
除法不推荐用 vector 直接手写——它需要试商、多次减法、边界判断极多,实际项目中应换用已有库(如 Boost.Multiprecision)或改用字符串模拟长除。真要硬写,优先实现「除以单精度整数(int)」,它只要一轮从高位向下做带余除法即可。
最容易被忽略的一点:所有操作前,务必确保输入 vector 不含非法数码(比如 digits[i] >= 10),否则乘法中间结果会溢出 int;可在 debug 版本加 assert 检查。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










