备战2020冬季甲级PAT考试。
计算 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; }to_string() 转化为字符串: string s = to_string(a+b);
统计字符串长度: int len = s.length();