给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = "2", num2 = "3" 输出: "6"
简单题里有过让自己写乘法的题目,当时只需要使用几个temp中间变量储存进位信息就行了。
string multiply(string num1, string num2) {
long long sum = 0;
long long ressum = 0;
long long temp3 = 0;
if (num1 == "0" || num2 == "0") return "0";
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
for (long long j = 0; j < num2.length(); j++) {
long long temp2 = num2[j] - '0';
cout << "temp2:" << temp2 << endl;
for (long long i = 0; i < num1.length(); i++) {
long long temp1 = num1[i] - '0';
cout << "temp1:" << temp1 << endl;
long long temp4 = temp1 * temp2;
cout << "temp4:" << temp4 << endl;
long long temp5 = temp4 % 10;
cout << "temp5:" << temp5 << endl;
sum = sum + (temp5 + temp3)*pow(10,i);
cout << "sum:" << sum << endl;
temp3 = temp4 / 10;
cout << "temp3:" << temp3 << endl;
}
sum = sum + temp3 * pow(10, num1.length());
ressum = sum * pow(10, j) + ressum;
cout << ressum<<endl;
sum = 0;
temp3 = 0;
cout << endl << endl;
}
stringstream ss;
ss << ressum;
string res = ss.str();
return res;
}
中等题肯定不能这么做了,因为测试用例的数都很大,这种解法不能通过。
所以我们不使用数值类型的temp储存进位,而使用vector储存运算的中间结果。
如图,运算中间过程实际都可以存入数组。按照乘法的计算流程,先算字符串末尾的,存入vector末尾,有进位就存入上一位。
对于普通题目,如果代码越改越复杂,那么多半是思路错了,重新理清思路就好了。
string multiply(string num1, string num2) {
if (num1 == "0" || num2 == "0") return "0";
vector<int> res(num1.length() + num2.length());
for (int i = num1.length() - 1; i >= 0; i--) {
int temp1 = num1[i] - '0';
for (int j = num2.length() - 1; j >= 0; j--) {
int temp2 = num2[j] - '0';
int chengji = temp1 * temp2;
res[i + j + 1] = chengji % 10+ res[i + j + 1];
res[i + j ] = chengji / 10+ res[i + j];
}
}
for (int i = res.size()-1; i >= 1; i--) {
if (res[i] >= 10) {
res[i - 1] = res[i - 1] + res[i] / 10;
res[i] = res[i] % 10;
}
}
/*
for (auto i : res) {
cout << i << " ";
}
*/
if (res[0] == 0) {
res.erase(res.begin());
}
string result;
for (auto i : res) {
result += to_string(i);
}
return result;
}