题目
代码(5.2 首刷看解析)
class Solution {
public:
string multiply(string num1, string num2) {
if(num1 == "0" || num2 == "0")
return "0";
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int m = num1.size(), n = num2.size();
vector<int> tmp(m+n+1, 0);
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
int n1 = num1[i]-'0';
int n2 = num2[j]-'0';
tmp[i+j] += n1*n2;
}
}
string ans="";
for(int i = 0; i < m+n; i++) {
tmp[i+1] += tmp[i]/10;
tmp[i] = tmp[i]%10;
if(i == m+n-1 && tmp[i] == 0) // 如果最高位没有进位,则则不需要把0包括进去
continue;
ans += tmp[i]+'0';
}
reverse(ans.begin(), ans.end());
return ans;
}
};
代码(7.5 二刷看解析)
若模拟真实乘法,会出现溢出的情况。
class Solution {
public:
string multiply(string num1, string num2) {
if(num1 == "0" || num2 == "0")
return "0";
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int m = num1.size(), n = num2.size();
vector<int> tmp(m+n+1);
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
int a = num1[i]-'0', b = num2[j]-'0';
tmp[i+j] += a*b;
}
}
string res = "";
for(int i = 0; i < m+n; i++) {
tmp[i+1] += tmp[i]/10;
tmp[i] %= 10;
if(i == m+n-1 && tmp[i] == 0) // 如果最高位没有进位,则则不需要把0包括进去
continue;
res += tmp[i] + '0';
}
reverse(res.begin(), res.end());
return res;
}
};
代码(9.7 三刷自解)
class Solution {
public:
string multiply(string num1, string num2) {
if(num1 == "0" || num2 == "0")
return "0";
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int m = num1.size(), n = num2.size();
vector<int> nums(m+n+1);
int flag = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
int num = (num1[i]-'0')*(num2[j]-'0');
nums[i+j] += num;
// cout<<nums[i+j]<<" ";
}
}
string ans;
for(int i = 0; i < m+n; i++) {
int num = nums[i];
nums[i] %= 10;
nums[i+1] += num/10;
cout<<num<<" ";
ans.push_back(nums[i]+'0');
}
reverse(ans.begin(), ans.end());
int i = 0;
while(ans[i] == '0') i++;
return ans.substr(i);
}
};