-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMultiply Strings.txt
47 lines (47 loc) · 1.43 KB
/
Multiply Strings.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {
public:
string multiply(string num1, string num2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int size1 = num1.size(), size2 = num2.size(), size3 = size1 + size2;
if (!size1 || !size2)
return "";
vector<int> n1, n2;
for (int i = size1 - 1; i >= 0; i--)
n1.push_back(num1[i] - '0');
for (int i = size2 - 1; i >= 0; i--)
n2.push_back(num2[i] - '0');
vector<int> r1(size3+1, 0);
multiply(r1, n1, n2, 0);
for (int i = 1; i < num2.size(); i++) {
vector<int> r2(size3+1, 0);
multiply(r2, n1, n2, i);
add(r1, r2);
}
while (r1.back() == 0)
r1.pop_back();
string ret;
for (int i = r1.size() - 1; i >= 0; i--)
ret += (char)('0' + r1[i]);
return ret.empty()?"0":ret;
}
void multiply(vector<int>& r, vector<int>& n1, vector<int>& n2, int p) {
int m = n2[p], c = 0;
for (int i = 0; i < n1.size(); i++) {
int sum = m*n1[i] + c;
r[p++] = sum%10;
c = sum/10;
}
if (c > 0)
r[p] = c;
}
void add(vector<int>& r1, vector<int> r2) {
int p = 0, c = 0;
while (p < r1.size()) {
int sum = r1[p] + r2[p] + c;
r1[p] = sum%10;
c = sum/10;
p++;
}
}
};