【LeetCode】字符串相乘_leetcode

9   9   9
× 6 7 8
----------------------
72 72 72
63 63 63
54 54 54
----------------------
54 117 189 135 72
----------------------
54 117 189 142 2
-----------------------
54 117 203 2 2
-----------------------
54 137 3 2 2
-----------------------
67 7 3 2 2
-----------------------
6 7 7 3 2 2
class Solution {
public:
string multiply(string num1, string num2) {
if(num1 == "0" || num2 == "0") return "0";
int m = num1.size();
int n = num2.size();
vector<int> vec;
// i指向num1
int start = 0;
for(int j = n - 1; j >= 0; j--){
// j指向num2
int idx = start;
for(int i = m - 1; i >= 0; i--){
int res = (num2[j] - '0') * (num1[i] - '0');
if(idx >= vec.size()) vec.push_back(res);
else vec[idx] += res;
idx++;
}
start++;
}
string ans;
for(int k = 0; k < vec.size() - 1; k++){
vec[k + 1] += (vec[k] / 10);
ans = to_string(vec[k] % 10) + ans;
}
ans = to_string(vec[vec.size() - 1]) + ans;

return ans;
}
};
class Solution {
public:
string multiply(string num1, string num2) {
if(num1 == "0" || num2 == "0") return "0";
int m = num1.size();
int n = num2.size();
string ans(m + n, '0');
for(int j = n - 1; j >= 0; j--){
for(int i = m - 1; i >= 0; i--){
// 注意以下三步
// 个位数相乘再加上个位数,res不大于100
// 先计算出res,根据i、j下标,确定当前计算结果应该放置的位置
int res = ans[i + j + 1] - '0' + (num2[j] - '0') * (num1[i] - '0');
ans[i + j + 1] = (res % 10) + '0';
ans[i + j] += res / 10;
}
}
int k = 0;
while(ans[k] == '0') k++;
return ans.substr(k, m + n - k);
}
};