题意:

image.png

解题思路:

  1. 思路:
  2. 1. 该算法是通过两数相乘时,乘数某位与被乘数某位相乘,与产生结果的位置的规律来完成。
  3. 2. 具体规律如下:
  4. * 乘数 num1 位数为 MM,被乘数 num2 位数为 NN num1 x num2 结果 res 最大总位数为 M+N
  5. * num1[i] x num2[j] 的结果为 tmp(位数为两位,"0x","xy"的形式),其第一位位于 res[i+j],第二位位于 res[i+j+1]。


图示:

image.png

PHP代码实现:

  1. class Solution {
  2. function multiply($num1, $num2) {
  3. if ($num1 == '0' || $num2 == '0') return '0';
  4. $len1 = strlen($num1);
  5. $len2 = strlen($num2);
  6. $res = array_fill(0, ($len1+$len2), 0);
  7. for ($i = $len2 - 1; $i >= 0; $i--) {
  8. for ($j = $len1 - 1; $j >= 0; $j--) {
  9. $temp = $res[$i + $j + 1] + $num1[$j] * $num2[$i];
  10. $res[$i + $j + 1] = fmod($temp, 10);
  11. $res[$i + $j] += floor($temp / 10);
  12. }
  13. }
  14. $ans = '';
  15. for ($i = 0; $i < ($len1 + $len2); $i++) {
  16. if ($i == 0 && $res[$i] == '0') continue;
  17. $ans .= (string) $res[$i];
  18. }
  19. return $ans;
  20. }
  21. }

GO代码实现:

  1. func multiply(num1 string, num2 string) string {
  2. if num1 == "0" || num2 == "0" {
  3. return "0"
  4. }
  5. res := make([]int, len(num1) + len(num2))
  6. for i := len(num2)-1; i >= 0; i -- {
  7. n2 := int(num2[i] - '0')
  8. for j := len(num1)-1; j >= 0; j -- {
  9. n1 := int(num1[j] - '0')
  10. sum := n2 * n1 + res[i+j+1]
  11. res[i+j+1] = sum % 10
  12. res[i+j] += sum / 10
  13. }
  14. }
  15. ans := ""
  16. for k, v := range res {
  17. if k == 0 && v == 0 {
  18. continue
  19. }
  20. ans += string(v + '0')
  21. }
  22. return ans
  23. }