js无辜的超长数字字符串相乘

本文探讨了LeetCode第43题的解决方案,通过从头部开始相乘而不是从末尾,简化了JavaScript中处理超长数字字符串相乘的算法。提到无论怎样都可以拆分成单个字符相乘,只需确保对应角标正确,避免了反转操作,同时提到了使用ES6的BigInt新特性来处理大整数运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

力扣43题
受到启发可以写成str[i + j] += num1[i] * num2[j]的形式
但是我可以不用末尾相乘开始而是从头部开始
因为无论怎样都会拆成单字符X单字符的形式,只要角标对应,无所谓前后顺序
编码还会简单些,不需要reverse

const multiply = (num1, num2) => {
    //简化排除头部的0,并且排除有一个数是0的情况
    num1 = num1.split('')
    num2 = num2.split('')
    while (num1[0] === '0') num1.shift()
    if (num1.length === 0) return '0'
    while (num2[0] === '0') num2.shift()
    if (num2.length === 0) return '0'
    //下面从最高位开始针对每两位进行乘法,先不进位
    let str = []
    const l1 = num1.length;
    const l2 = num2.length;
    for (let i = 0; i < l1; i++)
        for (let j = 0; j < l2; j++) 
            str[i + j] ? str[i + j] += num1[i] * num2[j] : str[i + j] = num1[i] * num2[j]
    //从后向前依次进位,超过十位的向前一位丢,只保留除首位外每位都是各位
    //c可以是十位数以上,可以向上传递
    //最高位可以是任意位数字,形成字符串之后看不出差异
    for (let k = str.length - 1; k > 0; k--) {
        let c = (str[k] / 10) | 0
        str[k] = str[k] % 10
        str[k - 1] += c
    }
    return str.join('')
};

以999*99为例可以看见我str的变化
在这里插入图片描述
或者使用es6新特性BigInt

var multiply=(num1, num2)=>{
    return BigInt(num1)*BigInt(num2)+""
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值