PAT (Advanced Level) Practice 1108 Finding Average (20 分) 凌宸1642
题目描述:
The basic task is simple: given N real numbers, you are supposed to calculate their average. But what makes it complicated is that some of the input numbers might not be legal. A legal input is a real number in [−1000,1000] and is accurate up to no more than 2 decimal places. When you calculate the average, those illegal numbers must not be counted in.
译:基本任务很简单:给定 N 个实数,你应该计算它们的平均值。 但让事情变得复杂的是,某些输入数字可能不合法。 合法输入是 [−1000,1000] 中的实数,精确到不超过 2 位小数。 在计算平均值时,不得将那些非法数字计算在内。。
Input Specification (输入说明):
Each input file contains one test case. For each case, the first line gives a positive integer N (≤100). Then N numbers are given in the next line, separated by one space..
译:每个输入文件包含一个测试用例。 对于每种情况,第一行给出一个正整数 N (≤100)。 然后在下一行给出 N 个数字,用一个空格分隔。
output Specification (输出说明):
For each illegal input number, print in a line ERROR: X is not a legal number
where X
is the input. Then finally print in a line the result: The average of K numbers is Y
where K
is the number of legal inputs and Y
is their average, accurate to 2 decimal places. In case the average cannot be calculated, output Undefined
instead of Y
. In case K
is only 1, output The average of 1 number is Y
instead.
译:对于每个非法输入的数字,打印一行 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
。
Sample Input1 (样例输入1):
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
Sample Output1 (样例输出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
Sample Input2 (样例输入2):
2
aaa -9999
Sample Output2 (样例输出2):
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined
The Idea:
-
非常常规的一道签到题,唯一需要注意的就是,当只有一个合法数字的时候,number 是没有加 s 的 。
-
对于判断是否合法数字的时候,我才用了先看是否含有 数字 和 负号
-
和小数点.
之外的字符,如果有则一定是非法数字。 -
然后根据小数点的位置和个数来进行分支判断
- 如果小数点个数多余 1 个,则肯定不合法。
- 如果小数点数量为 1 个,但是位置却在开头,不合法。
- 如果小数点个数为 1个,但是小数点后面的数字多余 2位小数 ,不合法
- 如果小数点合法之后,利用
sscanf
函数,将其转为数字,再判断数字是否在合法区间内,是则数字合法,累加其值;否则数字不合法
The Codes:
#include<bits/stdc++.h>
using namespace std ;
string s ;
int n , ans ;
double sum , temp ;
bool deal(string s){
int pos = 0 , ind = -1 ;
for(int i = 0 ; i < s.size() ; i ++){
if(s[i] == '-') continue ;
else if(s[i] == '.') ind = i , pos ++ ;
else if(s[i] < '0' || s[i] > '9') return false ;
}
if(pos > 1) return false ; // 小数点个数多余 1 个
if(ind == 0) return false ; // 开头就是小数点
if(ind != -1 && s.size() - ind > 3) return false ;
else {
sscanf(s.c_str() , "%lf" , &temp) ;
if(temp < -1000 || temp > 1000) return false ; // 不在 [-1000,1000]之内
sum += temp ;
ans ++ ;
return true ;
}
}
int main(){
cin >> n ;
for(int i = 0 ; i < n ; i ++){
cin >> s ;
if(!deal(s)) printf("ERROR: %s is not a legal number\n" , s.c_str()) ;
}
if(ans == 0) printf("The average of 0 numbers is Undefined\n") ;
else if(ans == 1) printf("The average of 1 number is %.2f\n" , sum) ;
else printf("The average of %d numbers is %.2f\n" , ans , sum / ans) ;
return 0 ;
}