和我们正常做乘法一样,从后往前乘,考虑当前两个位数,余数和进数以及已经算出来的结果不停地update结果就可以了。唯一有问题的就是考虑前面位数为000的时候,要重新扫一遍。
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
string multiply(std::string num1, std::string num2) {
int n1=num1.size();
int n2=num2.size();
if (n1==0 || n2==0)
return "0";
string res(n1+n2+1,'0');
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
for (int i=0; i<n1; i++){
int dig1=num1[i]-'0';
int carry=0;
for (int j=0; j<n2; j++){
int exist=res[i+j]-'0';
int dig2=num2[j]-'0';
res[i+j]=(dig1*dig2+exist+carry)%10+'0';
carry=(dig1*dig2+exist+carry)/10;
}
if (carry>0)
res[i+n2]=carry+'0';
}
reverse(res.begin(),res.end());
int start=0;
while(res[start]=='0' && start<res.size())
start++;
if (start==res.size())
return "0";
return res.substr(start,res.size()-start);
}
};
int main() {
string num1 = "0";
string num2 = "0";
Solution s;
cout << num1 << "*" << num2 << "=";
cout << s.multiply(num1, num2) << endl;
return 0;
}