题目
题目来源:力扣(LeetCode)
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
思路分析
如果 num1 和 num2 之一是 0,则直接将 0 作为结果返回即可。
如果 num1 和 num2 都不是 0,则可以通过模拟「竖式乘法」的方法计算乘积。从右往左遍历乘数,将乘数的每一位与被乘数相乘得到对应的结果,再将每次得到的结果累加。这道题中,被乘数是 num1,乘数是 num2。
需要注意的是,num2 除了最低位以外,其余的每一位的运算结果都需要补 0。
var multiply = function (num1, num2) {
// 如果 num1 和 num2 其中一个为 0,其乘积为 0,直接将 0 作为结果返回
if (num1 == '0' || num2 == '0') return '0';
// 被乘数(num1) x 乘数(num2)
let len1 = num1.length;
let len2 = num2.length;
// 长度是n和长度是m的数字相乘,乘积的位数最多只有 n + m 位
let res = new Array(len1 + len2).fill(0);
// 定义指针 i, j 分别指向 num1,num2 的长度
let i = len1, j = len2;
// 从 个位数开始逐位相乘
while (i) {
i--;
while (j) {
j--;
// num1[i] 和 num2[j] 的乘积对应的就是 res[i+j] 和 res[i+j+1] 这两个位置
// 乘积在 res 对应的索引位置
const index1 = i + j;
const index2 = i + j + 1;
// 乘积
const tempSum = num1[i] * num2[j];
// 乘积叠加到 res 上
let sum = tempSum + res[index2];
// 十位保留整数,各位保留余数
res[index1] += 0 | sum / 10;
res[index2] = sum % 10;
}
// 遍历完被乘数 num2,将指针 j 的位置重新指向 被乘数num2 的长度,让乘数num1 的下一位 (从右往左遍历乘数) 继续与被乘数的每一位相乘
j = len2;
}
//while循环,删除高位多余的0
while (res[0] == 0) {
res.shift();
}
// 将计算结果准换成字符串
return res.join('');
}