算法列表

43.字符串相乘 中等

布莱克2026-03-03 13:55字符串

问题:

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

回答:

按照算数的乘法操作一位位的进行相乘,因为每次相乘都有可能有进位,

初始化一个数组,长度为两个字符串长度和,每位都设置为0,因为相乘最大的位数不会超过两数长度之和

遍历两个字符串,然后逐位相乘,两个数字相乘后 res[i + j + 1] 保存当前位数的值,然后res[i + j]保存进位

最终将结果转为字符串,因为初始res为m + n位,有可能结果位数不到这么多,但结果位数可以确认最低为 m + n - 1,  截取掉第一位

var multiply = function(num1, num2) {
    if (num1 == '0' || num2 == '0') return '0';
    let add = 0;
    let m = num1.length;
    let n = num2.length;
    let res = new Array(m + n).fill(0);
    for (let i = m - 1; i >= 0; i--) {
        let val1 = Number(num1[i]);
        for (let j = n - 1; j >= 0; j--) {
            let val2 = Number(num2[j]);
            let sum = val1 * val2 + res[i + j + 1]
            res[i + j + 1] = sum % 10;
            //进制位累加
            res[i + j] = res[i + j] + Math.floor(sum / 10);
        }
    }
    //将结果转化为字符串
    res = res.join('')
    if (res[0] == 0) {
        //结果最低为m + n - 1位数
        res = res.slice(1)
    }
    return res;
};


assistant