PAT (Basic Level) Practice 1054 求平均值
阿新 • • 發佈:2018-12-20
注意審題!
其實應該算是一個簡單模擬題,重點是審題
當合格數只有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; }