1、题目解析
2、算法解析
1、解法一
使用模拟的方法:模拟小学的列竖式运算
细节1:高位相乘的时候要补上“0”
细节2:处理前导“0”
细节3:注意计算结果的顺序
2、解法二
对比解法一做优化->无进位相乘然后相加,最后处理进位。
3、代码编写
class Solution {
public:
string multiply(string num1, string num2)
{
//翻转字符串便于计算
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int n = num1.size();
int m = num2.size();
vector<int> tmp(n+m-1, 0);
//无进位相加
for(int i = 0; i < n;i++)
{
for(int j = 0; j < m; j++)
{
tmp[i+j] += (num1[i] - '0') * (num2[j] - '0');
}
}
//处理进位
int cur = 0, t = 0;
string ret;
while(cur < n + m -1 || t != 0)
{
if(cur < n + m -1) t += tmp[cur++];
ret += t % 10 + '0';
t = t/10;
}
//处理前导零
while(ret.size() > 1 && ret.back() == '0')
{
ret.pop_back();
}
reverse(ret.begin(), ret.end());
return ret;
}
};