字符串相乘
描述
-
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式
-
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数
示例 1
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2
输入: num1 = "123", num2 = "456"
输出: "56088"
提示
- 1 <= num1.length, num2.length <= 200
- num1 和 num2 只能由数字组成
- num1 和 num2 都不包含任何前导零,除了数字0本身
Typescript 版算法实现
1 ) 方案1:做加法
function multiply(num1: string, num2: string): string {
if (num1 === "0" || num2 === "0") return "0";
let ans = "0";
const m = num1.length;
const n = num2.length;
for (let i = n - 1; i >= 0; i--) {
let curr = "";
let carry = 0;
// 添加适当的零位
for (let j = n - 1; j > i; j--) {
curr += "0";
}
const y = parseInt(num2.charAt(i), 10);
for (let j = m - 1; j >= 0; j--) {
const x = parseInt(num1.charAt(j), 10);
const product = x * y + carry;
curr = (product % 10).toString() + curr;
carry = Math.floor(product / 10);
}
while (carry !== 0) {
curr = (carry % 10).toString() + curr;
carry = Math.floor(carry / 10);
}
ans = addStrings(ans, curr);
}
return ans;
}
function addStrings(num1: string, num2: string): string {
let i = num1.length - 1;
let j = num2.length - 1;
let carry = 0;
let result = "";
while (i >= 0 || j >= 0 || carry !== 0) {
const x = i >= 0 ? parseInt(num1.charAt(i), 10) : 0;
const y = j >= 0 ? parseInt(num2.charAt(j), 10) : 0;
const sum = x + y + carry;
result = (sum % 10).toString() + result;
carry = Math.floor(sum / 10);
i--;
j--;
}
return result;
}
2 ) 方案2:做乘法
function multiply(num1: string, num2: string): string {
if (num1 === "0" || num2 === "0") return "0";
const m = num1.length;
const n = num2.length;
const ansArr: number[] = new Array(m + n).fill(0);
// 计算每一位的乘积并累加到 ansArr 中
for (let i = m - 1; i >= 0; i--) {
const x = parseInt(num1.charAt(i), 10);
for (let j = n - 1; j >= 0; j--) {
const y = parseInt(num2.charAt(j), 10);
ansArr[i + j + 1] += x * y;
}
}
// 处理进位
for (let i = m + n - 1; i > 0; i--) {
ansArr[i - 1] += Math.floor(ansArr[i] / 10);
ansArr[i] %= 10;
}
// 构建最终结果字符串
let ans = "";
let idx = 0;
if (ansArr[0] === 0) {
idx = 1;
}
for (; idx < m + n; idx++) {
ans += ansArr[idx].toString();
}
return ans;
}
1660



被折叠的 条评论
为什么被折叠?



