力扣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)+""
}