PAT A1001 A+B Format (20)
2019-03-17 本文已影响0人
ranerr_
PAT A1001 A+B Format 原题链接
PAT甲级题目目录(简书)
PAT甲级题目目录(CSDN)
在CSDN上查看本文
Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).
Input Specification:
Each input file contains one test case. Each case contains a pair of integers a and b where −106≤a,b≤106. The numbers are separated by a space.
Output Specification:
For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.
Sample Input:
-1000000 9
Sample Output:
-999,991
一次代码:
思路: 将数值输出为字符串然后从后往前加上逗号,最后打印结果
分析:
- 遇到数字显示类需要按位处理的程序时使用
sprintf (#include <cstring>)
转换成字符数组 - 为了防止符号被当成数字计算位数,符号需要单独处理
- 在需要判断正负号输出时注意
0
的符号 - 在进行操作时注意下标与操作的对应关系:这里是显示
','
还是数字的区别
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int main() {
int a, b, sum;
bool ispositive;
char s_sum[100];
scanf("%d%d", &a, &b);
sum = a + b;
if (sum >= 0)
ispositive = true;
else
ispositive = false;
sum = abs(sum);
sprintf(s_sum, "%d", sum);
int len = int(strlen(s_sum));
int comma_tag = len;
if (len > 3) {
while (comma_tag > 0) {
comma_tag -= 3;
if (comma_tag > 0) {
for (int i = len; i >= comma_tag; i--) {
//因为要移动'\0'所以从len开始
s_sum[i + 1] = s_sum[i];
}
s_sum[comma_tag] = ',';
}
}
}
if (ispositive) ;
else
printf("-");
printf("%s", s_sum);
return 0;
}
改进代码:
思路: 对于仅作输出用的字符串进行操作时,可以边计算边输出,而不用真的修改字符串
分析:
- 在输入输出数量不大,格式不复杂时可以考虑使用
iostream
- 对于仅作输出用的字符串进行操作时,可以边计算边输出,而不用真的修改字符串
- 符号可以当做数字一起处理,只要在输出时判断
','
不要加在'-'
和数字之间即可 - 由于逗号的位置是从后开始数的,但是按位输出时需要从前开始输出,需要求出正序下标和倒序下标之间的转化关系.如图,设"倒序下标"为
,每当输出完满足
的位上的字符时输出一个逗号(不包括
'-'
和最后一位).观察得出(
len
是字符串长度).
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
string s = to_string(a + b);
int len = s.length();
for (int i = 0; i < len; i++) {
cout << s[i];
if (s[i] == '-')
continue;
if ((len - 1 - i) % 3 == 0 && i != len - 1)
cout << ',';
}
return 0;
}
二次改进代码:
分析:
- 希望在不麻烦的情况下把
continue
那一句拿到循环外面做 - 想要把符号和数字分开处理,即需要计算伪下标
和倒序下标
的关系.如图,
刚好和连同负号一起考虑时一样
#include <iostream>
#include <string>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
string s = to_string(a + b);
int len = s.length();
int i = 0;
if (s[i] == '-') {
cout << s[i];
i++;
}
for (; i < len; i++) {
cout << s[i];
if ((len - 1 - i) % 3 == 0 && i != len - 1)
cout << ',';
}
return 0;
}