PAT-1054 求平均值
阿新 • • 發佈:2018-12-21
1054 求平均值 (20 分)
本題的基本要求非常簡單:給定 N 個實數,計算它們的平均值。但複雜的是有些輸入資料可能是非法的。一個“合法”的輸入是 [−1000,1000] 區間內的實數,並且最多精確到小數點後 2 位。當你計算平均值的時候,不能把那些非法的資料算在內。
輸入格式:
輸入第一行給出正整數 N(≤100)。隨後一行給出 N 個實數,數字間以一個空格分隔。
輸出格式:
對每個非法輸入,在一行中輸出 ERROR: X is not a legal number
,其中 X
是輸入。最後在一行中輸出結果:The average of K numbers is Y
,其中 K
是合法輸入的個數,Y
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
#include<iostream> #include<algorithm> #include<cmath> #include<stdio.h> #include<string> #include<cctype> using namespace std; int n; char str[101][101]; bool check(char s[]){//逐個檢查數字是否符合要求,不符合隨時return false int i = 0,j; if(s[0]=='-'){ i++; } for(;s[i]&&s[i]!='.';i++){ if(!isdigit(s[i])){ return false; } } if(s[i]=='.'){ for(j=i+1;s[j];j++){ if(!isdigit(s[j])||j-i>2){ return false; } } } double a = fabs(atof(s)); if(a>1000.0){ return false; } return true; } void solve(){ int ans = 0; double sum = 0; for(int i=0;i<n;i++){ if(check(str[i])){ ans++; sum += atof(str[i]);//將string型別數轉換為浮點數 }else{ printf("ERROR: %s is not a legal number\n",str[i]); } } if(ans){ if(ans==1){ printf("The average of 1 number is %.2lf\n",sum); }else{ printf("The average of %d numbers is %.2lf\n",ans,sum/ans); } }else{ printf("The average of 0 numbers is Undefined\n"); } } int main() { scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",str[i]); } solve(); return 0; }