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

C++动态数组实现大整数乘法问题求助

解决方案

一、修复乘法逻辑错误

你的核心问题是乘法实现逻辑完全不符合大整数乘法规则,同时multiply函数存在明显错误:

1. 修正multiply函数

当前函数中当num为0时返回num + otherInt是错误的,0乘以任何数都应为0,直接简化为:

int largeIntegers::multiply(const int otherInt)
{
    return num * otherInt;
}

2. 重新实现大整数乘法逻辑

大整数乘法的正确逻辑是:

  • 假设两个数的各位从右往左(个位为第0位)分别存在numList1(长度len1)和numList2(长度len2)中
  • numList1的第i位与numList2的第j位相乘,结果需要累加到结果数组的第i+j位
  • 所有位相乘累加完成后,再统一处理每一位的进位

修正后的乘法代码示例:

// 定义结果数组的长度:两个数长度之和
int resultLen = len1 + len2;
// 初始化结果数组为全0,长度为resultLen
largeIntegers* numResults = new largeIntegers[resultLen]();

// 第一步:遍历所有位相乘并累加
for (int i = 0; i < len1; i++) {
    int digit1 = numList1[i].value();
    if (digit1 == 0) continue; // 跳过0,优化计算
    for (int j = 0; j < len2; j++) {
        int digit2 = numList2[j].value();
        int product = digit1 * digit2;
        // 累加到结果数组的i+j位
        numResults[i+j].setValue(numResults[i+j].add(product));
    }
}

// 第二步:统一处理进位
for (int k = 0; k < resultLen - 1; k++) {
    int currentVal = numResults[k].value();
    if (currentVal > 9) {
        int carry = currentVal / 10;
        // 当前位保留个位
        numResults[k].setValue(currentVal % 10);
        // 进位加到下一位(若你的数组是高位存于小索引,需调整遍历方向和进位目标位)
        numResults[k+1].setValue(numResults[k+1].add(carry));
    }
}

注意:如果你的数组是高位存于小索引、低位存于大索引(例如123存在数组[1,2,3],索引0是百位),需要反转数组后按上述逻辑处理,完成后再反转结果数组即可。

二、解决结果数组容量不足问题

两个长度为n和m的整数相乘,结果的最大长度是n + m位(例如999×999=998001,3位×3位=6位),因此:

  • 结果数组的长度必须初始化为len(num1) + len(num2),而非输入数字的最大长度
  • 初始化时将所有位设为0,预留足够空间存放最高位的进位

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:51:11