题目
题目来源:力扣(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循环,删除高位多余的0while (res[0] == 0) {res.shift();}// 将计算结果准换成字符串return res.join('');}
