Javascript乘法字符串
我在做以下关于乘法字符串的leetcode问题: 问题是 给定两个表示为字符串的非负整数num1和num2, 返回num1和num2的乘积,也表示为字符串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: "
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()
};