You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现存储在vector中的两个大整数的高效相乘运算

大整数乘法更高效率实现方案

你当前在用的是常规竖式模拟乘法,时间复杂度为O(n*m)(n、m为两个大整数的数位长度),针对大数场景有不少更高效的实现思路:

  • 基数放大优化:这是改造成本最低的优化手段,如果你现在vector每个元素存的是单十进制位(0-9),可以把每个位的基数改成10^9(对应9位十进制数,刚好不超过32位int的乘积上限),直接把运算次数降到原有的1/9,数位长度在万级以内的时候,收益比复杂的优化算法更明显。
  • Karatsuba分治乘法:时间复杂度约为O(n^1.585),比常规竖式快很多,适合数万位级别的大整数相乘。核心思路是把两个大数拆成高低两半,把原本需要的4次子乘法减少到3次,通过加减法置换乘法次数降低复杂度,你已经实现了大整数加法,只需要额外补充大整数减法、数位左移(末尾补零对应乘基数的N次方)逻辑即可快速实现。
  • FFT/NTT基乘法:适合十万位以上的超大整数相乘,时间复杂度可以做到O(n log n),是目前工业级大整数库的主流实现方案。原理是大整数乘法本质上是数位系数的卷积运算,通过快速傅里叶变换(FFT)可以把卷积运算从O(n²)降到O(n log n),如果担心浮点精度问题可以用快速数论变换(NTT)在模域下做整数运算,完全避免精度误差。

另外你当前的伪代码也可以做小优化,不需要每次算完一行乘积就调用一次加法函数,可以先把所有乘积按偏移量累加到同一个数组,最后统一处理一次进位,能省去大量加法函数的调用开销,优化后逻辑参考:

// 假设base为你使用的数位基数,比如10、10^9等
vector<int> res(v1.size() + v2.size(), 0);
for (int i = 0; i < v1.size(); i++) {
    for (int j = 0; j < v2.size(); j++) {
        res[i + j] += v1[i] * v2[j];
    }
}
// 统一处理进位
int carry = 0;
for (int i = 0; i < res.size(); i++) {
    int total = res[i] + carry;
    res[i] = total % base;
    carry = total / base;
}
// 最后去除前导零即可得到最终结果

内容的提问来源于stack exchange,提问作者thankyoubasedgod39

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:06:03