PAT 甲级 1001 A+B Format (20 分)

题目:PAT 甲级 1001 A+B Format (20 分)

经验总结:
两数之和的结果有三种可能:正数、0、负数。特别要注意0的情况,不要忽视了。

解法一(数字转字符串处理):首先将数字结果转换成字符串,判断是否是负数,是负数就先把负号输出,然后去掉负号再对剩下的数字做判断。如果要输出逗号,那么这个逗号的前面必须且至少有个数字。所以可以遍历字符串,输出当前字符后,判断从当前字符开始到结尾的长度是否满足%3==1,既满足输出逗号前必须有且至少有个数字的特点。但注意当输出最后一个字符时不能输出逗号。

C++代码(数字转字符串处理):

#include
using namespace std;
int main() {
	int a,b;
	cin>>a>>b;
	string s(to_string(a+b));
	if('-' == s[0]){ //如果是负数
		cout<<"-"; //先输出负号
		s=s.substr(1); //去掉负号再进一步处理
	}
	if(s.size()<4) {
		cout<<s;
	} else {
		for(int i=0; i<s.size(); i++) {
			cout<<s[i];
			if(1 == (s.size()-i)%3 && i!=s.size()-1){ //注意最后一个字符输出后不能加逗号
				cout<<",";
			}
		}
	}
	return 0;
}

解法二(将数字和逗号放入栈中):首先判断是否是负数,是负数先输出负号,然后负数乘以负一转换成正数再做进一步处理。将数字一位一位的放入栈中,在放入栈中之前判断是否需要放入逗号,判断的原理和解法一相同。放入数字之前先计数,当计数大于3且%3==1的时候就可以放入逗号了,比如在放入倒数第四个数字时满足放入逗号的条件,就先放入逗号再放入数字。特别要注意此解法要单独特殊对待两数之和为0的情况,因为不像字符串处理,结果为0也可以转换成字符串后输出。

C++代码(将数字和逗号放入栈中):

#include
using namespace std;
int main() {
	int a,b,cnt = 0;
	cin>>a>>b;
	int sum = a+b;
	stack<char> s;
	if(sum<0) {
		cout<<"-";
		sum *= -1;
	}else if(0==sum){ //要注意之和为0的情况
		cout<<0;
	}
	while(sum) {
		cnt++; //先计数,判断在放入当前数字之前是否应该先放入逗号
		if(cnt>3 && 1==cnt%3) s.push(',');
		s.push(sum%10+'0');
		sum/=10;
	}
	while(!s.empty()) {
		cout<<s.top();
		s.pop();
	}
	return 0;
}

你可能感兴趣的:(PAT,甲级)