javascript 相乘字符串

zfciruhq  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(127)
    • 问题集**-给定两个表示为字符串的非负整数num1和num2,返回num1和num2的乘积(也表示为字符串)。

我的算法似乎工作正常,除了一个测试用例回文从1 - 9

    • 更新**

javascript有一个parse方法,但我不想用它,因为问题来自leetcode,或者事实上来自任何这样的网站,习题集明确地说了这一点。

//**Input:**
var n1 = "123456789"
var n2 = "987654321"

var multiply = function(str1, str2) {
  var sum = 0, k = 1;
  for( var i = str1.length - 1; i>=0; i--){
      var val1 = parseInt(str1[i], 10) * k;

      k *= 10;
      var d = 1;
      for(var j = str2.length - 1; j >=0; j--){
          var val2 = parseInt(str2[j], 10) * d;
          d *= 10;

          sum +=  val1 * val2;

      }
  }
  return sum.toString();
};

console.log(multiply(n1,n2))

我不明白出了什么问题。其他回文还可以。

pcww981p

pcww981p1#

这样做的目的可能是实现自己的大数乘法算法,当整数(本例中的乘积)需要超过15-16位数时,JavaScript数字类型无法以足够的精度存储,因此如果只对输入使用乘法运算符,结果将是错误的。
即使你在一个数字变量中对较小的乘积求和,这个和最终也会超过Number.MAX_SAFE_INTEGER的限制,你需要将较小的计算结果存储在另一个数据结构中,比如数组或字符串。
下面是长乘法算法的一个简单实现:

function multiply(a, b) {
    const product = Array(a.length+b.length).fill(0);
    for (let i = a.length; i--; null) {
        let carry = 0;
        for (let j = b.length; j--; null) {
            product[1+i+j] += carry + a[i]*b[j];
            carry = Math.floor(product[1+i+j] / 10);
            product[1+i+j] = product[1+i+j] % 10;
        }
        product[i] += carry;
    }
    return product.join("").replace(/^0*(\d)/, "$1");
}

console.log(multiply("123456789", "987654321"));

从ECMAScript 2020开始,JavaScript就有了bigint数据类型,使用它可以直接进行乘法运算(注意n后缀):

console.log((123456789n * 987654321n).toString());

NB:在浏览器中,您不需要显式调用toString(),但上面的Stack Snippet控制台实现是有限的,因此它需要它。

kzipqqlq

kzipqqlq2#

在Chrome中,你可以使用BigInt算法来处理任意大整数(通常声明适用),运行这个例子看看它是否有所不同。

let p1 = BigInt(1000000000) * BigInt(123456789) + BigInt(123456789)
  , p2 = BigInt(1000000000) * BigInt(987654321) + BigInt(987654321)
  ;
  
console.log(`standard: =${123456789 * 987654321}`);
console.log(`standard large: =${123456789123456789 * 987654321987654321}`);
console.log(`BigInt: =${p1 * p2}`);

相关问题