js實現大數相乘

昨晚用js寫了個大數相乘的函數,模擬寫豎式計算,但性能過低,算得很慢。後來在leetCode看了高票答案,讚歎算法的神奇。傳送門=>LeetCode-Multiply Stringsjava

引用高票答主的圖片:算法

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碼,知道的還請多多指教。函數

相關文章
相關標籤/搜索