1. 程式人生 > >PAT乙級 1054 求平均值

PAT乙級 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

程式碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
	int N,cnt_legal=0;
	scanf("%d",&N);
	char number[50];
	double sum=0;
	for(int i=0;i<N;++i){
		scanf("%s",number);
		int sign=0,cnt=0,cnt_point=0,sign_legal=1;
		for(int j=0;j<strlen(number);++j){
			if(sign) ++cnt;
			if((number[j]<'0'||number[j]>'9')&&number[j]!='-'&&number[j]!='.'){
				sign_legal=0;break;
			}
			if(number[j]=='.'){
				++cnt_point,sign=1;
			}
			if(cnt_point>1){
				sign_legal=0;break;
			}
			if(cnt>=3){
				sign_legal=0;break;
			}
			double temp=atof(number);
			if(temp>1000||temp<-1000){
				sign_legal=0;break;
			}
		}
		if(sign_legal){
			++cnt_legal; 
			sum+=atof(number);
		}
		else{
			printf("ERROR: %s is not a legal number\n",number);
		}
	}
	if(cnt_legal)
		printf("The average of %d numbers is %.2lf",cnt_legal,sum/cnt_legal);
	else
		printf("The average of %d numbers is Undefined",cnt_legal);
	return 0;
} 

在這裡插入圖片描述

出現的問題:

測試點2錯誤。

第一次修改:

更改了輸出之後測試點2通過,不過不知道原因是什麼,感覺莫名其妙,難道是因為當合法資料只有一個時和除去了1嗎?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
	int N,cnt_legal=0;
	scanf("%d",&N);
	char number[50];
	double sum=0;
	for(int i=0;i<N;++i){
		scanf("%s",number);
		int sign=0,cnt=0,cnt_point=0,sign_legal=1;
		for(int j=0;j<strlen(number);++j){
			if(sign) ++cnt;
			if(number[0]=='.'){
				sign_legal=0;break;
			} 
			if((number[j]<'0'||number[j]>'9')&&number[j]!='-'&&number[j]!='.'){
				sign_legal=0;break;
			}
			if(number[j]=='.'){
				++cnt_point,sign=1;
			}
			if(cnt_point>1){
				sign_legal=0;break;
			}
			if(cnt>2&&cnt_point==1){
				sign_legal=0;break;
			}
			double temp=atof(number);
			if(temp>1000||temp<-1000){
				sign_legal=0;break;
			}
		}
		if(sign_legal){
			++cnt_legal; 
			sum+=atof(number);
		}
		else{
			printf("ERROR: %s is not a legal number\n",number);
		}
	}
	if(cnt_legal==0){
		printf("The average of 0 numbers is Undefined");
	} 
	else if(cnt_legal==1){
		printf("The average of 1 number is %.2lf",sum);
	} 
	else{
		printf("The average of %d numbers is %.2lf",cnt_legal,sum/cnt_legal);
	}
//	if(cnt_legal)
//		printf("The average of %d numbers is %.2lf",cnt_legal,sum/cnt_legal);
//	else
//		printf("The average of %d numbers is Undefined",cnt_legal);
	return 0;
} 

在這裡插入圖片描述