用数据存储后按位相加,记录进位,但是这个自动转化为指数表示法了,过不了用例,吐血
// var multiply = function(num1, num2) {
// if(num1==0|| num2==0) return "0"
// let list = num2.split('')
// let length = list.length-1
// let result = list.map((item, i) => {
// return (Number(item) * Number(num1) * Math.pow(10, length-i)).toString().split('')
// })
// let temp = 0
// let number = num1.length+num2.length
// let resultList = Array(number).fill(0)
// for(let i=0; i<number; i++){
// let sum = 0
// for(let j=0; j<=length; j++){
// sum+=Number(result[j].pop() || 0)
// }
// sum+=temp
// let before = parseInt(sum / 10)
// if(before>0) {
// temp = before
// } else {
// temp = 0
// }
// resultList[i] = sum % 10
// }
// if(temp > 0) {
// resultList.push(temp)
// }
// let endList = resultList.reverse()
// if(endList[0]==0) {
// endList.shift()
// }
// return endList.join('')
// };
用一个数组来存储,每次进行一个位的乘积更新,类似动态规划
var multiply = function (num1, num2) {
if (num1 === '0' || num2 === '0') return '0'
let n = num1.length,
m = num2.length
dp = new Array(n + m).fill(0)
for (let i = n - 1; i >= 0; i--) {
for (let j = m - 1; j >= 0; j--) {
// dp[i+j+1] 包含上一轮该乘积
let sum = dp[i + j + 1] + parseInt(num1[i] * num2[j], 10)
// 当前位i+j+1
dp[i + j + 1] = parseInt(sum % 10, 10)
// 上一位
dp[i + j] = dp[i + j] + parseInt(sum / 10, 10)
}
}
return dp.join('').replace(/^0*/, '')
}
网友评论