You need to enable JavaScript to run this app. 如何用C++实现字符串相乘并避免整数溢出问题?
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 09:24:03