PAT Basic 1054
Posted yxp400
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT Basic 1054相关的知识,希望对你有一定的参考价值。
1054 求平均值
本题的基本要求非常简单:给定 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 number
The average of 0 numbers is Undefined
题解:这道题要注意,首先满足以下几种情况就是错误数据
1.由字母组成或者包含字母。
2.有两个或两个以上的小数点。
3.数据超过[-1000,1000]范围。
我们需要对每个数据进行判断,如果不是错误数据,将其加到总数上并在正确数据个数上加一即可。最后进行输出,输出时注意当正确个数为1时的情况。
知识点复习:
①atof包含在头文件#include <stdlib.h>下,用于将字符串转化为浮点数,(只能处理char数组,不可以处理string串)。
②使用string的话,可以借助stringstream来实现字符串到浮点数的操作,stringstream包含在#include<sstream>下,每次使用前记得要使用.clear()清空流的错误标记,并且用.str()方法赋值。(现在感觉stringstream是真的好用,可以实现字符串到int,字符串到double的转换,还可以用流的方式给字符串赋值。)
③也可以使用sscanf() 和sprintf()进行这个转换操作,时间有点晚,明天给你们接着写这个。
代码如下:
1 #include<iostream> 2 #include<string> 3 #include<sstream> 4 using namespace std; 5 6 int main() 7 { 8 int num, N, k = 0; 9 double sum = 0, y; 10 string a; 11 stringstream ss; 12 scanf("%d",&N); 13 while(N--){ 14 bool flag1 = true, flag2 = false; 15 cin>>a; 16 int num2 = 0, num3 = 0; 17 for( int i = 0; i < a.length(); i++){ 18 if( (a[i] < ‘0‘ || a[i] > ‘9‘) && a[i] != ‘.‘ && a[i] != ‘-‘ ){ 19 flag1 = false; 20 break; 21 } 22 if(flag2) 23 num2++; 24 if( num2 > 2){ 25 flag1 = false; 26 break; 27 } 28 if( a[i] == ‘.‘ ){ 29 flag2 = true; 30 num3++; 31 } 32 if(num3 > 1){ 33 flag1 = false; 34 break; 35 } 36 } 37 ss.clear(); 38 ss.str(a); 39 ss>>y; 40 if(!flag1 || ( y > 1000 || y < -1000 )){ 41 cout<<"ERROR: "<<a<<" is not a legal number "; 42 continue; 43 } 44 sum += y; 45 k++; 46 } 47 if(k==0) 48 cout<<"The average of 0 numbers is Undefined"; 49 else if(k>1){ 50 cout<<"The average of "<<k<<" numbers is "; 51 printf("%0.2lf",sum/k); 52 } 53 else if( k == 1){ 54 cout<<"The average of 1 number is "; 55 printf("%0.2lf",sum); 56 } 57 return 0; 58 }
以上是关于PAT Basic 1054的主要内容,如果未能解决你的问题,请参考以下文章
pat 1054 The Dominant Color(20 分)