Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript将字符串-[Leetcode]相乘_Javascript_Algorithm - Fatal编程技术网

使用JavaScript将字符串-[Leetcode]相乘

使用JavaScript将字符串-[Leetcode]相乘,javascript,algorithm,Javascript,Algorithm,我处理这个问题的时间太长了,我似乎找不到我的逻辑有什么问题 提示: 给定两个表示为字符串的非负整数num1和num2, 返回num1和num2的乘积 注: num1和num2的长度均小于110 num1和num2都包含 只有数字0-9 num1和num2都不包含任何前导零 您不能使用任何内置的BigInteger库或转换输入 直接转换为整数 以下是我的尝试: var multiply=函数(num1,num2){ var结果=0; //如果任何NUM为0,则自动为零 如果(num1[0]=='

我处理这个问题的时间太长了,我似乎找不到我的逻辑有什么问题

提示:

给定两个表示为字符串的非负整数num1和num2, 返回num1和num2的乘积

注:

num1和num2的长度均小于110

num1和num2都包含 只有数字0-9

num1和num2都不包含任何前导零

您不能使用任何内置的BigInteger库或转换输入 直接转换为整数

以下是我的尝试:

var multiply=函数(num1,num2){
var结果=0;
//如果任何NUM为0,则自动为零
如果(num1[0]=='0'| | num2[0]=='0'){
返回“0”
};
var length1=num1.length-1;
变量长度2=num2.length-1;
var计数器i=0;
var iBase10=1;
对于(变量i=length1;i>=0;i--){
iBase10=数学功率(10,计数器i)
计数器i++;
var计数器j=0
var jBase10=1;
对于(var j=length2;j>=0;j--){
jBase10=数学功率(10,计数器j)
counterJ++;
结果+=(num1[i]*iBase10)*(num2[j]*jBase10)
}
}
返回result.toString()
};
var结果=乘法(“123456789”、“987654321”);

console.log(结果);//应为121932631112635269
您的实际结果不准确,因为您将结果存储在一个数字类型的变量中,并且中间变量iBase10和jBase10在某一点上会变得不准确。JavaScript使用64位浮点数来存储数字,因此对于小数位数约为17或更多的数字,这种表示方式将失去准确性。这就是为什么最后的数字是0而不是9

相反,您需要处理更小的数字,并保持在JavaScript能够管理的范围内。最终的结果应该是一个字符串,因为一旦你把它转换成数字,不准确就会出现

下面是一个简单的实现,它模仿了您在一张纸上所做的操作:您计算数字1的每个数字与数字2的每个数字的乘积,并在结果中的正确数字位置对这些乘积求和,将任何溢出的值传递到下一个数字:

    123 
    456
------- *
    738      <--- intermediate products
   615
  492
------- +
  56088     <---- sum of those products
input{width:40em}
1号:
第二条:
产品:


您的“result”变量应该是一个数组,并且您需要添加逻辑来处理进位。即使您修复了当前给您错误的最后一位数字,您也有一个更重要的问题:iBase10、jBase10和result在您开始使用超过17位的输入时将变成不准确的数字。您需要一种不同的方法。您的代码使用基本的javascript数字类型,它不能容纳非常大的值!试试这个,你就会明白发生了什么:
parseInt(“121932631112635269”)!我认为你应该用字符串而不是数字来处理大数字的总和!
var multiply = function(num1, num2) {
let product = new Array(num1.length + num2.length).fill(0)
for (let i = num1.length; i--;) {
    let carry = 0
    for (let j = num2.length; j--;) {
        product[1 + i + j] += carry + num1[i] * num2[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");
};
var multiply = function(a, b) {
   return (BigInt(a)*BigInt(b)).toString()
};