题目

题目来源:力扣(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。

  1. var multiply = function (num1, num2) {
  2. // 如果 num1 和 num2 其中一个为 0,其乘积为 0,直接将 0 作为结果返回
  3. if (num1 == '0' || num2 == '0') return '0';
  4. // 被乘数(num1) x 乘数(num2)
  5. let len1 = num1.length;
  6. let len2 = num2.length;
  7. // 长度是n和长度是m的数字相乘,乘积的位数最多只有 n + m 位
  8. let res = new Array(len1 + len2).fill(0);
  9. // 定义指针 i, j 分别指向 num1,num2 的长度
  10. let i = len1, j = len2;
  11. // 从 个位数开始逐位相乘
  12. while (i) {
  13. i--;
  14. while (j) {
  15. j--;
  16. // num1[i] 和 num2[j] 的乘积对应的就是 res[i+j] 和 res[i+j+1] 这两个位置
  17. // 乘积在 res 对应的索引位置
  18. const index1 = i + j;
  19. const index2 = i + j + 1;
  20. // 乘积
  21. const tempSum = num1[i] * num2[j];
  22. // 乘积叠加到 res 上
  23. let sum = tempSum + res[index2];
  24. // 十位保留整数,各位保留余数
  25. res[index1] += 0 | sum / 10;
  26. res[index2] = sum % 10;
  27. }
  28. // 遍历完被乘数 num2,将指针 j 的位置重新指向 被乘数num2 的长度,让乘数num1 的下一位 (从右往左遍历乘数) 继续与被乘数的每一位相乘
  29. j = len2;
  30. }
  31. //while循环,删除高位多余的0
  32. while (res[0] == 0) {
  33. res.shift();
  34. }
  35. // 将计算结果准换成字符串
  36. return res.join('');
  37. }

借鉴 :https://leetcode-cn.com/problems/multiply-strings/solution/gao-pin-mian-shi-xi-lie-zi-fu-chuan-cheng-fa-by-la/