JS笔试题:大数相乘

245 阅读2分钟
题目:

当有超出数值范围的数字需要相乘,对他们进行运算并返回字符串

// JS笔试 大数乘法 
function multiply(num1, num2) {
	// TODO
}

console.log(multiply('109999999999999999', '2')) 
// '219999999999999998'
console.log(multiply('12345678901234567890', '2')) 
// '24691357802469135780'
console.log(multiply('12345678901234567890', '1234567890')) 
// '15241578751714678875019052100'

这一题的解题思路主要是通过乘法笔算中的竖式运算来完成 需要一个数组存储运算后的结果 这个数组需要预先将所有元素填充成0方便我们后面进行直接运算,数组元素是竖式计算单位的结果,因为两个个位整数相乘最大是81不会超过js的整数范围,另外我们发现运算结果的长度不会超过两个乘数的长度之和

image.png

答案:

function multiply (num1, num2) {
  // 如果其中一位是0的话,那么结果一定是0,直接返回
  if (num1 === '0' || num2 === '0') {
    return '0'
  }

  const store = new Array(num1.length + num2.length).fill(0)
  
  for (let i = num2.length - 1; i >= 0; i--) {
    for (let j = num1.length - 1; j >= 0; j--) {
      // i作为乘数2的位数索引,同时作为尾数是否需要补零的标准
      store[i + j + 1] += Number(num2[i]) * Number(num1[j])
      // 判断是否超过两位数,如果超过进行进位处理
      if (store[i + j + 1] > 9) {
        store[i + j] += Math.floor(store[i + j + 1] / 10)
        store[i + j + 1] = store[i + j + 1] % 10
      }
    }
  }
  return store.join('').replace(/^0*/, '')
}

欢迎指点