js实现大数相乘

昨晚用js写了个大数相乘的函数,模拟写竖式计算,但性能太低,算得很慢。后来在leetCode看了高票答案,赞叹算法的神奇。传送门=>LeetCode-Multiply Strings

引用高票答主的图片:

clipboard.png
没想到下标之间还有这样的对应关系。算法工程师真的活该拿高薪!
因为他是用java写的,我转化成js如下

var multiply = function(num1, num2) {
  if(isNaN(num1) || isNaN(num2)) return '' //判断输入是不是数字
  var len1 = num1.length,
    len2 = num2.length
  var ans = []
  for (var i = len1 - 1; i >= 0; i--) {    //这里倒过来遍历很妙,不需要处理进位了
    for (var j = len2 - 1; j >= 0; j--) {
      var index1 = i + j
      var index2 = i + j + 1
      var mul = num1[i] * num2[j] + (ans[index2] || 0)
      ans[index1] = Math.floor(mul / 10) + (ans[index1] || 0)
      ans[index2] = mul % 10
    }
  }
  var result = ans.join('')
    //这里结果有可能会是多个零的情况,需要转成数字判断
    //原来写的是return +result === 0 ? '0' : result,result字符串会出现有前置0的情况,感谢评论区小伙伴@nicknice的提醒让我找到了这个错误
    return +result === 0 ? '0' : result.replace(/^0+/,'')

}

js数组有join()方法,感觉代码要简洁一些。数组直接用字面量也不需要提前分配内存。
为了增强代码的强壮性,函数第一行是判断输入的合法性,不是数字也就没有进行运算的必要了,返回一个空串。原高票答案没有做这方面的处理,输入字母的话结果始终是2401,不清楚是什么原因,也不是ASCII码,知道的还请多多指教。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值