PAT甲級A1108 Finding Average (20分)/字符串

題目鏈接:https://pintia.cn/problem-sets/994805342720868352/problems/994805360777347072

讀幾個數,不合法就報錯,計算合法的數量和平均數。

構思這種題,一開始就要思考測試點都在哪,這樣纔能有的放矢嘛——最保險的思路就是題目有說的,都當測試點,沒說的地方,對於這種20分的題,先不要管。

這道題的測試都是淺顯的覆蓋了以下情況:
1、(易錯點)有沒有分合法的數的數量是0、1、其他,其中0和其他的number帶s,1的不帶s;
2、帶兩個小數點以上的數
3、含有除了數字、符號、小數點以外的數,如aaa
4、小數位數超過兩位的數
5、大小不在[-1000,1000]範圍內的數
6、(易錯點)輸出的小數要是兩位的

不需要考慮的點:
1、輸入的數是1.000、2.000等,後面帶0的小數超過了2位,合法不合法
2、輸入帶兩個負號的,合法不合法

滿分代碼如下:

int main(){
    int n,num=0;
    double total=0.0;
    cin>>n;
    string s;
    for(int i=0;i<n;i++){
        cin>>s;
        bool f=true;
        int dot=0;
        int len=s.size();
        for(int j=0;j<len;j++){
            if(s[j]=='-'&&j>0){
                f=false;
            }
            if(s[j]!='-'&& s[j]!='.' && !isdigit(s[j])){
                f=false;
            }
            if(s[j]=='.'){
                dot++;
            }
        }
        if(f && dot>1){
            f=false;
        }
        
        if(f){
            int pos=s.find('.');
            if(pos!=-1){
                int zero=s.find_last_not_of('0');
                //int zero=s.size()-1;
                if(zero-pos>2){
                    f=false;
                }
            }
        }
        if(f && (stof(s)>1000.0 || stof(s)<-1000.0)){
            f=false;
        }
        if(!f){
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
        }else{
            num++;
            total+=stod(s);
        }
    }
    if(num==0){
        cout<<"The average of 0 numbers is Undefined";
    }else if(num==1){
        printf("The average of 1 number is %.02lf",total);
    }else{
        printf("The average of %d numbers is %.02lf",num,(double)total/num);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章