基本思路:
大数运算问题,注意一下竖式优化:
重点是:
1.先保存,后续整体进位加和;
2.c[i+j+1]=a[i]+a[j];
3.乘法结果位数最大为m+n;
具体代码:
未优化版本:
class Solution {
public:
string add(string a, string b) {
string ret = "";
int carry = 0;
int l1 = a.size()-1, l2 = b.size()-1;
while (l1>=0||l2>=0) {
int x = 0, y = 0;
if (l1 >= 0)
x = a[l1--] - '0';
if (l2 >= 0) {
y = b[l2--] - '0';
}
int sum = x + y + carry;
ret = char('0' + (sum % 10)) + ret;
carry=sum/10;
}
if (carry != 0)
ret = '1' + ret;
return ret;
}
string multi(string a, int b, int index) {
string ret = "";
int carry = 0;
int l = a.size() - 1;
while (l>= 0) {
int x = a[l--] - '0';
int res = x * b + carry;
ret = char(res % 10 + '0') + ret;
carry=res/10;
}
while (carry != 0) {
ret = char(carry % 10 + '0') + ret;
carry /= 10;
}
while (index > 0) {
ret += '0';
index--;
}
return ret;
}
string multiply(string num1, string num2) {
if(num1=="0"||num2=="0")
return "0";
string ret = "";
for (int i = num2.size()-1; i >= 0; i--) {
int b = num2[i] - '0';
string temp = multi(num1, b, num2.size() - 1 - i);
ret = add(temp, ret);
}
return ret;
}
};
优化版本:
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>ret(m + n, 0);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ret[i + j + 1] += int(num1[i] - '0') * int(num2[j] - '0');
}
}
int carry = 0;
string s = "";
for (int i = m + n - 1; i >= 0; i--) {
int sum = ret[i] + carry;
s = char('0'+sum%10) + s;
carry = sum / 10;
}
if (s.size() != 0 && s[0] == '0')
s.erase(s.begin());
return s;
}
};