0
点赞
收藏
分享

微信扫一扫

正数字符串相加和相乘

鱼板番茄 2022-01-08 阅读 26
算法

正数字符串相加

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];

举报

相关推荐

0 条评论