PAT甲级-1001


PAT甲级-1001


题目翻译

1001: A+B的格式化

 计算a+b并以标准形式输出和,所谓标准形式就是,除少于四个数字的情况以外,这些数字必须分成三组,每组之间用一个逗号隔开。

输入格式

 每个输入文件包含一个测试样例,每个样例包含一对整数a和b,a和b的取值范围为(-106,106)。两个数之间用一个空格分隔。

输出格式

 对于每一个测试样例,输出的和占一行,和的格式按照上述的标准格式书写。

样例

输入
1
-1000000 9
输出
1
-999,991

题目分析

 输入两个整数求和很简单,用空格隔开的两个整数的读入只需要利用c++的输入流cin就能轻松完成。问题的难点在于从个位开始每隔三个数字加上一个逗号。如果得到的和是一个字符串,就能够很容易解决这个问题了。因此问题转化为将int型的数字转化成string型的字符串。

 在c++11标准中有std::to_string()可以实现从int到string类型的转化,调用格式是:

1
string str = std::to_string(int n);

 如果编译器不支持C++11标准,那么可以使用stringstream类完成,使用它要在头文件中包含”sstream”。具体原理可以参考:@cplusplus.com。使用方法如下,以int转string为例:

1
2
3
4
5
6
7
8
#include "sstream"
/*** codes ***/
int num = 12345;
stringstream tmp;
tmp << num;
string str;
stringstream >> str;
/*** codes ***/

 理解起来,stringstream类就像一个来者不拒的熔炉,它将传入的int型参数num读入到字符串缓冲区,重塑后输出到字符串型变量中。从string型到int型的转化同理。

 得到字符串类型的变量后,下一步就是每隔三个字符,插入一个逗号,这一操作用之前介绍过的string类的成员函数insert()来完成。此外还需要注意的是,因为有可能出现刚好符号和最高位之间可以插入一个逗号的情况,所以对于负数和正数要分开处理,先去掉符号进行转化和插入符号,再在输出前添上符号。

代码

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
#include "iostream"
#include "cstring"
#include "sstream"
using namespace std;

string int_to_string(int n){
stringstream str2;
str2 << n;
string str1;
str2 >> str1;
return str1;
}

string insert_commas(string &s){
for(int i=s.length()-3; i>0; i-=3){
s.insert(i, ",");
}
return s;
}

int main(){
int a, b;
cin >> a >> b;
int c = a + b;
bool sgn = false;
if(c < 0){
sgn = true;
c = -c;
}
string str = int_to_string(c);
str = insert_commas(str);
if(sgn) str.insert(0, "-");
cout << str << endl;
return 0;
}

踩坑指南

 最后,在解决这个问题的时候,我本以为输出格式应该是int型常量和字符串常量相交织的情况。比如样例中的“-999,991”,我以为应该是依次输出(char)’-‘和(int)999和(char)’,’和(int)991,这样一来问题变得异常复杂,不过仍然是一个可解的问题,等有时间再来探索。


转载请注明来源:©Tinshine