1. 程式人生 > 其它 >PAT (Advanced Level) Practice 1108 Finding Average (20 分) 凌宸1642

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

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 ;
}