1. 思路
大数乘法模拟题,其实就是模拟竖式乘法,其实仔细观察竖式乘法可以发现A数第i位乘以B数第j位的结果会累加到最后乘积的第i+j位(个位为第0位),所以只需要遍历i,j并且处理好进位关系就好了。
Ans [ _[ [ i _i i+ j _j j] += A i _i i + B j _j j
不过值得的是,字符串的高位是其代表数字的低位,而乘法需要从数字的低位算起, 不断进位。所以我们需要i , j 从两个字符串的高位开始遍历。
还有一个问题就是为了避免进位,我们需要将结果想后移动,也就是把i * j 放到 i + j + 1的位置。
最后还需要避免前置0的问题。
2.代码
class Solution {
public:
string multiply(string num1, string num2) {
int n = num1.length(), m = num2.length();
string ret(n + m,'0');
for(int i = n - 1; i >= 0; --i)
{
for(int j = m - 1; j >= 0; --j)
{
int sum = ret[i + j + 1] - '0' + (num1[i] - '0') * (num2[j] - '0');
ret[i + j + 1] = sum % 10 + '0';
ret[i + j] += sum / 10;
}
}
for(int i = 0; i < n + m; ++i)
if(ret[i] != '0')return ret.substr(i);
return "0";
}
};