PAT_A1108
PAT甲级1108.
目录
A1108
题目
样例
样例1
输入:
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
输出:
ERROR: aaa is not a legal number
ERROR: 9999 is not a legal number
ERROR: 2.3.4 is not a legal number
ERROR: 7.123 is not a legal number
The average of 3 numbers is 1.38
样例2
输入:
2
aaa -9999
输出:
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined
思路和坑点
思路:
由于给的输入不仅包含纯数字,还包含字符,所以使用字符串进行存储和处理。主要的处理过程为:每次读入一个字符串,然后对字符串进行判定,看是否满足合法性的要求,不合法数字进行错误提示输出,合法的数字进行统计和累加,需要统计的原因是因为涉及到计算平均值的时候数字个数的计算,按照题目要求需要特判。
坑点:
对于数字合法性的判定有以下的标准:
1.首先必须是数字。
2.不多于两个小数位。可以没有小数位,但是如果有小数位,必须不多于两位。
AC代码
#include<bits/stdc++.h>
using namespace std;
bool Isreal(char *s);
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
double sum=0;
int cnt=0,n;
char temp[50]; //使用字符串读入每一个数据
scanf("%d",&n);
for(int i=0;i<n;i++){ //依次读入n个数据,然会对每一个数据进行判断
scanf("%s",temp);
if(Isreal(temp)){ //如果是一个合法输入,转化为浮点数然后进行累加并计数
double num;
sscanf(temp,"%lf",&num);
sum+=num;
cnt++;
}
else //不合法数字输出不合法提示
printf("ERROR: %s is not a legal number\n",temp);
}
if(cnt==1) //合法数字的单复数处理
printf("The average of 1 number is ");
else
printf("The average of %d numbers is ",cnt);
if(cnt==0) //平均数计算中的除0处理
printf("Undefined");
else
printf("%.2f",sum/cnt);
return 0;
}
bool Isreal(char *s) //判断输入字符串合法性的函数,合法输入位-1000到1000(闭区间)的不多于两位小数的数字
{
double num;
int point=0;
for(int i=0;s[i]!='\0';i++){ //统计小数点个数
if(s[i]=='.')
point++;
}
if(point>1) //如果小数点个数大于1,显然不是一个合法输入
return false;
if(sscanf(s,"%lf",&num)==1){ //读取检测,如果成功读取到一个数字
if(num>=-1000&&num<=1000){ //检验浮点数的范围
if(point==1&&strrchr(s,'\0')-strrchr(s,'.')>3)
return false; //如果有是一个浮点形式(即有一个小数点),对小数点的位数进行判断
else return true;
}
else return false; //如果不满足数字的区间范围
}
else
return false; //如果不是数字
}