备战2020冬季甲级PAT考试。
1001 A+B Format (20分)
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).
计算 a+b 的值,并以标准形式输出它们的总和——意思就是说,每三个数位必须用逗号分隔开(除非一共就只有四位数)
Input Specification:
Each input file contains one test case. Each case contains a pair of integers a and b where −10e6≤a,b≤10e6. The numbers are separated by a space.
输入规范:
每个输入文件都包含一个测试样例,每个例子包含一对整数 a 和 b ,它们的取值范围是−10e6≤a,b≤10e6。两个整数之间用一个空格分隔。
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.
输出规范:
每个测试样例中,必须将a和b的总和输出到一行里。总和必须用标准输出形式输出。
输入输出样例:
第一次代码实现
这种实现方式非常笨重,而且没法AC;请教了朋友之后,他推荐给我柳神(柳婼)的笔记——
看了人家的代码才知道我差得远了!
我的问题根本不是怎么调AC,而是一开始思路就不对——做PAT题目的核心目的是练习算法,练习思维,而非机械输出以求快速找到样例答案!
#include <stdio.h>
int main()
{
int a;
int b;
//用户输入a 和b的值
scanf("%d %d",&a,&b);
//计算a+b的值
int sum=a+b;
//判断结果是否为负数,如果为负,取绝对值
if(sum<0)
{
printf("-");
sum = -sum;
}
//如果结果为零,直接输出
if(sum==0)
{
printf("0");
return 0;
}
//将和转换成字符串
//首先分离数位
char s[100];
int i=0;
while(sum!=0)
{
s[i] = '0'+sum %10; //将数字转换为字符的方式
sum = sum /10;
i++;
}
//i为数位个数
//将字符串逆序
int j;
for(j=0;j<i/2;j++)
{
char temp;
temp=s[j];
s[j]=s[i-1-j];
s[i-1-j]=temp;
}
//向字符串中填入逗号
int count=0;
for(j=i-1;j>=0;j--)
{
count++;
//从后向前,满三位就填入一个逗号
if((count==3)&&(j!=0))
{
int k;
for(k=i;k>j;k--)
{
s[k]=s[k-1];//从后向前覆盖
}
s[k]=',';//插入逗号
count=0;//开始重新计数
}
}
//输出字符串
for(j=0;j<=i;j++)
{
printf("%c",s[j]);
}
return 0;
}
第二次代码实现(参考柳神笔记)
这次就要简洁多了——思路正确是基本不会错太远的。
努力做正确的事,而不仅仅是努力。
#include <stdio.h>
int main()
{
int a;
int b;
//用户输入a 和b的值
scanf("%d %d",&a,&b);
//计算a+b的值
int sum=a+b;
//判断结果是否为负数,如果为负,取绝对值
if(sum<0)
{
printf("-");
sum = -sum;
}
//如果结果为零,直接输出
if(sum==0)
{
printf("0");
return 0;
}
//将和转换成字符串
//首先分离数位
char s[100];
int i=0;
while(sum!=0)
{
s[i] = '0'+sum %10; //将数字转换为字符的方式
sum = sum /10;
i++;
}
//i为数位个数
//将字符串逆序
int j;
for(j=0;j<i/2;j++)
{
char temp;
temp=s[j];
s[j]=s[i-1-j];
s[i-1-j]=temp;
}
//printf("\n%s\n",s);
//输出字符串并填入逗号
for(j=0;j<i+1;j++)
{
if(((i+1)%3==(j+1)%3)&&(j!=0)&&(j!=i))
printf(",");
printf("%c",s[j]);
}
return 0;
}
运行结果
总结
1)需要考虑的特殊情况:
①如果结果为负数,需要单独输出负号;
②第一位前面不要输出逗号;
③和为零的情况需要单独输出,因为存不进字符串;
2)还是用C++吧!!!封装库它不香吗?!! 看看人家柳神的代码,直接一个to_string ,等于我的 分离数位+存为字符串+字符串逆序
#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 ((i + 1) % 3 == len % 3 && i != len - 1) cout << ",";
}
return 0;
}
C++语法笔记
to_string() 转化为字符串:
string s = to_string(a+b);
统计字符串长度:
int len = s.length();
生词
word | translate |
---|---|
output in standard format | 以标准形式输出 |
be separated into groups | 被分离为组 |
commas | 逗号 |