首先看到题第一种想法就是暴力解答,就是用一个字符串中的一个数字和两一个成,然后把各个字符串再拼接起来。
先贴上我的蠢方法
这个办法看起来很长也很蠢,一开始bug也很多,调了半天,还好没有超时错误,后来又参考了别人的代码,真的死的心都有了,代码少,效率高。在本文的后面附上别人的解法。慢慢提高。
class Solution {
public:
string multiply(string num1, string num2) {
if (num1 == "0" || num2 == "0") {
return "0";
}
int n = num1.size();
int m = num2.size();
string max = "";
string min = "";
if (m<n) {
max += num1;
min += num2;
}
else {
max += num2;
min += num1;
}
vector<string>res;
reverse(min.begin(), min.end());
reverse(max.begin(), max.end());
for (int i = 0; i<min.size(); i++) {
mul(res, min[i], max);
for (int j = 0; j<i; j++) {
res[i].push_back('0');
}
}
string out = res[0];
for (int k = 1; k<res.size(); k++) {
out = add(out, res[k]);
reverse(out.begin(), out.end());
}
//(out.begin(), out.end());
return out;
}
string add(string a, string b) {
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
string out = "";
int flag = 0;
int i = 0;
for (i = 0; i<a.size(); i++) {
if (i>=b.size()) {
int c = a[i] - '0' + flag;
out.push_back(c % 10 + '0');
flag = c / 10;
}
else
{
int c = (a[i] - '0') + (b[i] - '0') + flag;
out.push_back(c % 10 + '0');
flag = c / 10;
}
}
if (i<b.size()) {
while (i<b.size()) {
int c = flag + (b[i++] - '0');
flag = c / 10;
out.push_back(c % 10 + '0');
}
}
if (flag)
out.push_back('1');
return out;
}
void mul(vector<string>&res, char c, string s) {
string str = "";
int flag = 0;
if (c == '0') {
res.push_back("0");
return;
}
else {
for (int i = 0; i<s.size(); i++) {
int cur = (c - '0')*(s[i] - '0');
str.push_back((cur + flag) % 10 + '0');
flag = (cur + flag) / 10;
}
if (flag != 0)
str.push_back(flag+'0');
reverse(str.begin(),str.end());
}
res.push_back(str);
}
};
找到规律,我们先把两个字符串反转然后发现res[i+j]的数字是num[i]和num[j]的乘积,有些小细节就是我们先把结果存储为int类型,也不计算进位,这样就能让程序更清楚,更不容易出现bug,最后应该返回res的倒序,因为一开始填充了0,所以我们应该先把开头的0过滤掉。
string multiply(string num1, string num2) {
if(num1=="0"||num2=="0")
return "0";
int n = num1.size();
int m = num2.size();
vector<int>res(n + m, 0);
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
res[i + j] = (num1[i]-'0') * (num2[j]-'0')+res[i+j];
}
}
for (int k = 0; k < res.size(); k++) {
if (k == res.size()-1) {
break;
}
res[k + 1] += res[k] / 10;
res[k] = res[k]%10;
}
string out = "";
int i = res.size() - 1;
while (res[i] == 0) --i;
if (i < 0) return "0";
while (i >= 0) out.push_back(res[i--] + '0');
return out;
}