题意:
解题思路:
思路:
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
}