本题的基本要求非常简单:给定N个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是[-1000,1000]区间内的实数,并且最多精确到小数点后2位。当你计算平均值的时候,不能把那些非法的数据算在内。
输入格式:
输入第一行给出正整数N(<=100)。随后一行给出N个实数,数字间以一个空格分隔。
输出格式:
对每个非法输入,在一行中输出“ERROR: X is not a legal number”,其中X是输入。最后在一行中输出结果:“The average of K numbers is Y”,其中K是合法输入的个数,Y是它们的平均值,精确到小数点后2位。如果平均值无法计算,则用“Undefined”替换Y。如果K为1,则输出“The average of 1 number is Y”。
输入样例1:7 5 -3.2 aaa 9999 2.3.4 7.123 2.35输出样例1:
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输出样例2:
ERROR: aaa is not a legal number ERROR: -9999 is not a legal numberThe average of 0 numbers is Undefined
这题好像是抄的,记不得了。。自己写的测试点有一个没过,先这样吧
下面是新做一遍的代码,这题特别有意思。他的不合法到底是哪几种情况,真的说不明白。。我那ac的代码测试了几种发现如下#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; int main(){ char *num[105]; int N,count=0; double average=0; cin>>N; for(int i=0;i<N;i++){ bool isNumber=true; //判断是否为合法数字 int point=0; //监视小数点的个数 int point_=0; //监视小数点之后的位数 num[i] = (char *)malloc(10*sizeof(char)); //申请空间 cin>>num[i]; int len=strlen(num[i]); double temp=atof(num[i]);//将字符串转换成数字,具体用法自行百度 if(temp<-1000||temp>1000) isNumber=false; for(int j=0;j<len;j++){ //对每一个元素的各个字符进行判断 if(point==1) point_++; if(num[i][j]=='-'&&j!=0){//如果含有-,则-只有一个且在第一位 isNumber=false; break; } if(num[i][j]!='.'){ if((num[i][j]<'0'||num[i][j]>'9')&&(num[i][j]!='-')){ isNumber=false; break; } }else { //如果是小数点 point++; } if(point_>2||point>1){//如果小数点大于一个或者小数位数多余2 isNumber=false; break; } } if(!isNumber) cout<<"ERROR: "<<num[i]<<" is not a legal number"<<endl; else { count++; average+=temp; } } if(count==1) printf("The average of 1 number is %.2lf",average);//这句必须要 ,1个数 答应的 是number 大于1个数打印的是 numbers,不知pat为什么在这里卡人 else if(count==0) printf("The average of 0 numbers is Undefined"); else printf("The average of %d numbers is %.2lf",count,average/count); return 0; }
“-” “-.” “-1.” “1.” “.” 都是合法的!
所以做这题千万不要考虑太深,很容易把自己玩蒙了
根据题目的要求来不合法的情况有
1. 两个及以上“.”
2.“.”后面有三个及以上数字
3.出现其他字符
别的我也没想到,还有别的还望不吝赐教
下面是写了注释的代码
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> using namespace std; int main() { int n,cnt=0;//cnt是合法数字的个数 cin>>n; char s[200]; double sum,temp; //temp存放atof的返回值用的 相关的可以百度一下atof用法,好玩的是输入样例中的2.3.4 转换后是2.3000… while(n--) { scanf("%s",s); temp=atof(s); if(temp<-1000||temp>1000) printf("ERROR: %s is not a legal number\n",s); else { int pointnum=0,pospoint=0,flag=0; //记录小数点的个数,小数点的位置 标记变量标记这个字符串是不是合法的 for(int i=0;i<strlen(s);i++) { if((s[i]<'0'||s[i]>'9')&&s[i]!='.'&&s[i]!='-') {flag++;break;} if(s[i]=='-') if(i){flag++;break;} if(s[i]=='.') pointnum++,pospoint=i; } if(!flag) { if((pointnum==1&&strlen(s)-pospoint<=3)||pointnum==0) sum+=temp,cnt++; else printf("ERROR: %s is not a legal number\n",s); } else printf("ERROR: %s is not a legal number\n",s); } } if(cnt==0) printf("The average of 0 numbers is Undefined");//细节问题 numbers else if(cnt==1) printf("The average of %d number is %.2lf",cnt,sum/(cnt*1.0));//细节问题 number else printf("The average of %d numbers is %.2lf",cnt,sum/(cnt*1.0)); return 0; }