1. 程式人生 > >PAT (Basic Level) Practice 1054 求平均值

PAT (Basic Level) Practice 1054 求平均值

乙級1054
在這裡插入圖片描述
在這裡插入圖片描述

注意審題!
其實應該算是一個簡單模擬題,重點是審題
當合格數只有1的時候,輸出的字串是number而不是numbers測試點3

因為輸入的東西什麼都可以有,所以用字串儲存輸入的值進行判斷
長度沒必要考慮,1是因為測試點沒有考,主要是不知道000000123.2這種用例符不符合出題人的“心思”
負號、小數點的位置,負號若有肯定是第一位,小數點若有肯定不能跟在負號後面。
我實名噁心測試點4,測試點4是形如123.這種字串最後一位帶小數點而且是合格數!
數值大小,我建議把輸入的正確數字轉成double後直接和1000比這樣簡單粗暴
主要被測試點4深深惡心到了 題不難
AC程式碼:

#include<bits/stdc++.h>
using namespace std;
void prerror(string temp);
void prerror(string temp){
	printf("ERROR: ");
	cout<<temp;
	printf(" is not a legal number\n");
}
int main(){
	int N,K=0,len,pointpos,iserror;
	vector<double> vect;
	string temp;
	double num;
	scanf("%d",&N);
	for(int i = 0;i<N;i++){
		cin>>temp;
		len = temp.length();
		num = 0,pointpos = 0,iserror = 0;
		for(int i = len - 1;i>=0;i--){
//			if(len>8){iserror = 1;	break;}//最長長度應為"-1000.00",len = 8 //實際上可能會有000000000.2這種 雖然測試點裡沒有 
			if((temp[i]<='9'&&temp[i]>='0')||temp[i]=='.'||temp[i]=='-'){
				if(temp[i]=='.'){
//					cout<<"getpoint\n"<<"pointpos = "<<pointpos<<endl;
					if(pointpos||i==0||(i>0&&temp[i-1]=='-')){ iserror = 1;	break;}//出現了第二個小數點,小數點在首位,小數點前面是負號 
					if(len-i-1==1)	num = num/10;
					else if(len-i-1==2)	num = num/100;
					else if(len-i-1==0) ;//測試點4 我實名噁心 
					else { iserror = 1;	break;}	//小數位大於2位 
					pointpos = i;
				}
				else if(temp[i]=='-'){
					if(i==0) num = 0 - num;
					else { iserror = 1;	break;}
				}	
				else{
					if(!pointpos)
						num = num + (temp[i]-'0')*(double)pow(10,len-i-1);
					else
						num = num +	(temp[i]-'0')*(double)pow(10,pointpos-i-1);				
				} 
			}else{ iserror = 1;	break;}//非數字,小數點,負號 
		}
		if(iserror||num>1000||num<-1000)	prerror(temp);
		else{
			vect.push_back(num);
		}
	}
	int size = vect.size();
	num = 0;
	if(size==0)	printf("The average of 0 numbers is Undefined\n");
	else if(size==1) printf("The average of 1 number is %.2lf\n",*vect.begin());//測試點3 審題!! 
	else{
		vector<double>::iterator iter;
		for(iter = vect.begin();iter!=vect.end();iter++){
		num += *iter;
		}
		printf("The average of %d numbers is %.2lf\n",size,num/size);
	}
	return 0;
}