正数字符串相加
string sum(string num1, string num2) {
string res;
int len1 = num1.length();
int len2 = num2.length();
if(len1 <= 0 || len2 <= 0)
return res;
if(num1 == "0") {
return num2;
}
if(num2 == "0") {
return num1;
}
stack<int> s1, s2;
stack<int> s;
int i = 0;
for(i = 0; i < len1 && i < len2; i++) {
s1.push(num1[i] - '0');
s2.push(num2[i] - '0');
}
if(i == len1) {
while(i < len2) {
s2.push(num2[i] - '0');
i++;
}
} else {
while(i < len1) {
s1.push(num1[i] - '0');
i++;
}
}
int upper = 0;
while(!s1.empty() && !s2.empty()) {
int tmp = (s1.top())+(s2.top());
s1.pop();
s2.pop();
tmp += upper;
if(tmp > 9) {
upper = tmp / 10;
tmp = tmp % 10;
} else {
upper = 0;
}
s.push(tmp);
}
printStack(s1);
cout << upper << endl;
if(s1.empty()) {
while(!s2.empty()) {
int tmp = s2.top();
s2.pop();
tmp += upper;
if(tmp > 9) {
upper = tmp / 10;
tmp = tmp % 10;
} else {
upper = 0;
}
s.push(tmp);
}
} else {
while(!s1.empty()) {
int tmp = s1.top();
s1.pop();
tmp += upper;
if(tmp > 9) {
upper = tmp / 10;
tmp = tmp % 10;
} else {
upper = 0;
}
s.push(tmp);
}
}
if(upper) {
s.push(upper);
}
while(!s.empty()) {
res.append(to_string(s.top()));
s.pop();
}
return res;
}
int main()
{
cout << sum("1234", "567");
return 0;
}
正数字符串相乘
class Solution {
public:
int max(int i, int j) {
return i >= j ? i : j;
}
int min(int i, int j) {
return i <= j ? i : j;
}
string multiply(string num1, string num2) {
string res;
int len1 = num1.length();
int len2 = num2.length();
if(len1 <= 0 || len2 <= 0)
return res;
if(num1 == "0" || num2 == "0") {
return "0";
}
if(num1 == "1") {
return num2;
}
if(num2 == "1") {
return num1;
}
vector<int> v1, v2, v;
vector<int>::iterator it;
stack<int> s;
int i = 0, j = 0;
for(i = 0; i < len1 && i < len2; i++) {
v1.push_back(num1[len1 - 1 - i] - '0');
v2.push_back(num2[len2 - 1 - i] - '0');
}
if(i == len1) {
while(i < len2) {
v2.push_back(num2[len2 - 1 - i] - '0');
i++;
}
} else {
while(i < len1) {
v1.push_back(num1[len1 - 1 - i] - '0');
i++;
}
}
int tmp = 0;
int upper = 0;
for(i = 0; i < len1 + len2 -1; i++) {
tmp = 0;
for (j = max(0, 1+i-len1); j <= min(len2-1, i); j++) {
tmp += v1[i - j] * v2[j];
}
tmp += upper;
upper = tmp / 10;
tmp = tmp % 10;
v.push_back(tmp);
}
if (upper > 0) {
v.push_back(upper);
}
for(i = v.size() -1 ; i >= 0; i--) {
res.append(to_string(v[i]));
}
return res;
}
};
解析
i = 0; i < len1 + len2 -1; i++ 时
第i位的值为:
tmp = v1[0] * v2[i] + v1[1] * v2[i-1] + … + v1[i] * v2[0]
即等于:j = 0; j <= i; j++ 时,v1[j]*v2[i-j] 的值相加
但是有个要求:
j >=0
j <=i
j >=0
j <= len1-1
i-j>=0
i-j<=len2-1
所以当i固定后,j的范围就是:
j >=0
j >= i+1-len2
j <= i
j <= len1-1
所以j的范围变成:
for (j = max(0, 1+i-len2); j <= min(len1-1, i); j++)
tmp += v1[j] * v2[i - j];
或者如下:
for (j = max(0, 1+i-len1); j <= min(len2-1, i); j++)
tmp += v1[i - j] * v2[j];