资讯专栏INFORMATION COLUMN

js实现大数相乘

cnTomato / 2740人阅读

摘要:昨晚用写了个大数相乘的函数,模拟写竖式计算,但性能太低,算得很慢。数组直接用字面量也不需要提前分配内存。为了增强代码的强壮性,函数第一行是判断输入的合法性,不是数字也就没有进行运算的必要了,返回一个空串。

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

引用高票答主的图片:


没想到下标之间还有这样的对应关系。算法工程师真的活该拿高薪!
因为他是用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码,知道的还请多多指教。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96867.html

相关文章

  • LeetCode43.字符串相乘 JavaScript

    摘要:给定两个以字符串形式表示的非负整数和,返回和的乘积,它们的乘积也表示为字符串形式。示例输入输出示例输入输出说明和的长度小于。和均不以零开头,除非是数字本身。不能使用任何标准库的大数类型比如或直接将输入转换为整数来处理。 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1: 输入: num1 = 2, ...

    kk_miles 评论0 收藏0
  • [Leetcode] Multiply String and Big Interger 大数乘法加法

    摘要:因为被乘数每一位数字和乘数相乘的结果是依次错开的,所以就没问题。判断两个数的大小的方法,是先判断其长度,如果长度不一样,则较长的较大,如果长度一样,则需要比较每一位。 Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a string. ...

    keithxiaoy 评论0 收藏0
  • 算法思想

    摘要:基础算法思想类别递推枚举递归分治贪婪回溯试探模拟递推递推分类顺推法从已知条件出发,逐步推算出要解决问题的方法。贪心算法的局限不能保证最后的解是最优的不能求最大最小解问题只能求满足某些约束条件的可行解范围。 基础算法思想类别 递推 枚举 递归 分治 贪婪 回溯(试探) 模拟 递推 递推分类 顺推法:从已知条件出发,逐步推算出要解决问题的方法。 逆推法:从已知结果出发,用迭代表达式...

    sshe 评论0 收藏0
  • 关于PHP精确计算模块

    摘要:精确计算的函数简介是的缩写。函数的参数都是操作数加上一个可选的,比如,如果没有提供,就用的缺省值。 PHP精确计算的BC函数 简介:bc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scal...

    MASAILA 评论0 收藏0
  • php浮点数精确运算

    摘要:所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者函数那么上面的算式我们应该改写为这样就能解决浮点数的计算问题了转自 bc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, s...

    SimonMa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<