PAT (Advanced Level) Practice 1108 Finding Average (20 分) 凌宸1642
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
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 ;
}