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