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
相关产品推荐
相关产品推荐

