如何用C++实现字符串相乘并避免整数溢出问题?
问题原因
你当前的实现逻辑和Python版本对齐,但Python支持任意精度的整数类型,C++的原生数值类型都有明确的存储上限:long long 类型最大仅能存储约9e18的整数,你给出的测试用例乘积已经达到1e21量级,必然超出类型范围触发溢出报错。同时你代码中使用pow函数计算10的幂次还会引入浮点精度误差,进一步导致结果错误。
解决方案
C++没有内置的大整数类型,因此不能直接用数值变量存储整个乘积,需要模拟手动乘法的计算逻辑,用数组存储每一位的计算结果,具体实现思路如下:
- 长度为n和m的两个非负整数相乘,乘积的最大长度为n+m
- 初始化长度为n+m的整数数组,所有元素默认值为0,用于存储每一位的中间计算结果
- 从右到左遍历两个数字的每一位,将单数字相乘的结果累加到数组的对应位置
- 遍历数组处理进位,每一位仅保留个位数,进位值加到高位
- 最后将数组转换为字符串,跳过前导零即可得到最终结果
修改后的可运行代码
#include <string> #include <vector> using namespace std; string multiply(string num1, string num2) { // 边界处理:任意输入为0直接返回"0" if (num1 == "0" || num2 == "0") { return "0"; } int n = num1.size(), m = num2.size(); vector<int> digitArr(n + m, 0); // 逐位相乘 for (int i = n - 1; i >= 0; --i) { int d1 = num1[i] - '0'; for (int j = m - 1; j >= 0; --j) { int d2 = num2[j] - '0'; int product = d1 * d2; int sum = product + digitArr[i + j + 1]; digitArr[i + j + 1] = sum % 10; digitArr[i + j] += sum / 10; } } // 转字符串,去掉前导零 string res; for (int digit : digitArr) { if (res.empty() && digit == 0) { continue; } res.push_back(digit + '0'); } return res; }
该代码可以正确通过你给出的测试用例,返回预期结果"1214447762756072040469",全程仅做单数字运算,不存在溢出风险。
内容的提问来源于stack exchange,提问作者Cookie
相关产品推荐
相关产品推荐

