题意:
解题思路:
思路:1. 该算法是通过两数相乘时,乘数某位与被乘数某位相乘,与产生结果的位置的规律来完成。2. 具体规律如下: * 乘数 num1 位数为 MM,被乘数 num2 位数为 NN, num1 x num2 结果 res 最大总位数为 M+N * num1[i] x num2[j] 的结果为 tmp(位数为两位,"0x","xy"的形式),其第一位位于 res[i+j],第二位位于 res[i+j+1]。
图示:
PHP代码实现:
class Solution { function multiply($num1, $num2) { if ($num1 == '0' || $num2 == '0') return '0'; $len1 = strlen($num1); $len2 = strlen($num2); $res = array_fill(0, ($len1+$len2), 0); for ($i = $len2 - 1; $i >= 0; $i--) { for ($j = $len1 - 1; $j >= 0; $j--) { $temp = $res[$i + $j + 1] + $num1[$j] * $num2[$i]; $res[$i + $j + 1] = fmod($temp, 10); $res[$i + $j] += floor($temp / 10); } } $ans = ''; for ($i = 0; $i < ($len1 + $len2); $i++) { if ($i == 0 && $res[$i] == '0') continue; $ans .= (string) $res[$i]; } return $ans; }}
GO代码实现:
func multiply(num1 string, num2 string) string { if num1 == "0" || num2 == "0" { return "0" } res := make([]int, len(num1) + len(num2)) for i := len(num2)-1; i >= 0; i -- { n2 := int(num2[i] - '0') for j := len(num1)-1; j >= 0; j -- { n1 := int(num1[j] - '0') sum := n2 * n1 + res[i+j+1] res[i+j+1] = sum % 10 res[i+j] += sum / 10 } } ans := "" for k, v := range res { if k == 0 && v == 0 { continue } ans += string(v + '0') } return ans}