Javascript乘法字符串

Javascript乘法字符串,javascript,Javascript,我在做以下关于乘法字符串的leetcode问题: 问题是 给定两个表示为字符串的非负整数num1和num2, 返回num1和num2的乘积,也表示为字符串 function mult(a, b){ return (Number(a) * Number(b)).toString(); } 例1: Input: num1 = "2", num2 = "3" Output: "6" Example 2: Input: num1 = "123", num2 = "456" Output: "

我在做以下关于乘法字符串的leetcode问题:

问题是

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

function mult(a, b){
    return (Number(a) * Number(b)).toString();
}
例1:

Input: num1 = "2", num2 = "3"
Output: "6"
Example 2:

Input: num1 = "123", num2 = "456"
Output: "56088"
注:

num1和num2的长度均小于110。num1和num2都包含

只有数字0-9。num1和num2都不包含任何前导零

除了数字0本身。您不能使用任何内置的BigInteger

库或直接将输入转换为整数

为此,我们采用了以下方法 1.将字符串转换为int 2.乘以整数

同样的算法是

const numberMap = {
    "0": 0,
    "1": 1, 
    "2": 2,
    "3": 3, 
    "4": 4,
    "5": 5,
    "6": 6,
    "7": 7, 
    "8": 8, 
    "9": 9
}
var multiply = function(num1, num2) {
    let i = num1.length
    let j = num2.length 
    let sum = currentPower = 0
    let firstNumber = secondNumber = 0
    while(i > 0 || j > 0) {
        // if I or J is equal to zero, means we have itterated hence we will set the value to one 
        const firstNum = i > 0 ? (numberMap[num1[i-1]]) * (10**currentPower) : 0
        const secondNum = j > 0 ? (numberMap[num2[j-1]]) * (10**currentPower) : 0 
        firstNumber += firstNum
        secondNumber += secondNum
        currentPower++
        i--
        j--
    }

    sum = firstNumber * secondNumber
    return sum.toString()
 }; 
但当给出以下输入时

"123456789"
"987654321"
它产生以下输出
“121932631112635260”
,而不是
“121932631112635269”


你知道我该怎么解决这个问题吗?

你可以把每个数字乘以另一个数字,然后把索引作为位置

就像你用手做的一样

1  2  3  4  *  4  3  2  1
-------------------------
               1  2  3  4
            1  4  6  8
         3  6  9 12
      4  8 12 16
-------------------------
      5  3  2  2  1  1  4
这种方法使用字符串的反转数组,并反转结果集

在重新调整结果之前,数组将被前导零过滤

函数乘法(a,b){
var aa=[…a].reverse(),
bb=[…b]。反向(),
p=[],
i、 j;
对于(i=0;i9){
如果(!p[i+j+1])p[i+j+1]=0;
p[i+j+1]+=数学层(p[i+j]/10);
p[i+j]]=10;
}
}
}
返回p
.reverse()
.filter((valid=>(v,i,{length})=>valid=+v | | | i+1==length)(false))
.加入(“”);
}
console.log(乘法('2','3');//6.
console.log(乘法('123','456');//56088
console.log(乘法('9133','0');//0

控制台.log(乘法('999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999您可以将每个数字与其他数字相乘,并将索引作为位置

就像你用手做的一样

1  2  3  4  *  4  3  2  1
-------------------------
               1  2  3  4
            1  4  6  8
         3  6  9 12
      4  8 12 16
-------------------------
      5  3  2  2  1  1  4
这种方法使用字符串的反转数组,并反转结果集

在重新调整结果之前,数组将被前导零过滤

函数乘法(a,b){
var aa=[…a].reverse(),
bb=[…b]。反向(),
p=[],
i、 j;
对于(i=0;i9){
如果(!p[i+j+1])p[i+j+1]=0;
p[i+j+1]+=数学层(p[i+j]/10);
p[i+j]]=10;
}
}
}
返回p
.reverse()
.filter((valid=>(v,i,{length})=>valid=+v | | | i+1==length)(false))
.加入(“”);
}
console.log(乘法('2','3');//6.
console.log(乘法('123','456');//56088
console.log(乘法('9133','0');//0

控制台.log(乘法('999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999只需将其转换为数字、乘法,然后再转换回字符串

function mult(a, b){
    return (Number(a) * Number(b)).toString();
}

在JavaScript中,int不是特定的类型。它们是数字类型。我们可以使用parseInt()函数而不是Number()函数来转换,但是我们知道我们正在接收一个int作为输入,因此不需要这种解析。

只需将其转换为数字,相乘,然后转换回字符串即可

function mult(a, b){
    return (Number(a) * Number(b)).toString();
}
var multiply = function(num1, num2) {
   let v1=BigInt(num1)
   let v2=BigInt(num2)
   let v3=v1*v2
   return v3.toString()
};

在JavaScript中,int不是特定的类型。它们是数字类型。我们可以使用parseInt()函数而不是Number()函数来转换,但我们知道我们无论如何都会收到一个int作为输入,因此不需要进行这种解析。

mult(“999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,“999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999”)返回“9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999(“999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999”)返回“9.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 E+217”正确,但您没有得到所有的数字。(请看我的答案……)转换成数字对小数字有效。为了使它对更长的数字有效,我们应该使用BigInt,参考我的解决方案。你能解释一下算法吗?你能解释一下算法吗?最好解释一下你的解决方案。这里的代码将输入字符串转换成可以容纳2^53-1的BigInt。然后将两个转换后的s相乘tring并将其分配给一个变量,然后将该变量转换为string并返回函数。最好稍微解释一下您的解决方案。这里的代码将输入字符串转换为可以容纳2^53-1的BigInt。然后将两个转换后的字符串相乘并将其分配给一个变量,然后将该变量转换为string并返回到函数行动。
var multiply = function(num1, num2) {
   let v1=BigInt(num1)
   let v2=BigInt(num2)
   let v3=v1*v2
   return v3.toString()
};