PAT A/甲级1108 Finding Average 测试点3勘误

题目链接

测试点3巨坑!除题目所列情形外,测试点3认为 xx. 也为合法数据。
若能想到sscanf与sprintf的运用,该题的难度就大幅度降低了。AC代码如下:

#include
#include
int main(){
    int n,num=0;
    scanf("%d",&n);
    char a[50],b[50];
    double temp,sum=0.0;
    for(int i=0;i<n;i++){
        int flag=0;
        scanf("%s",a);
        sscanf(a,"%lf",&temp);
        sprintf(b,"%.2f",temp);
        for(int j=0;j<strlen(a);j++){
            if(a[j]!=b[j]){
                flag=1;
                break;
            }
        }
        if(flag||temp<-1000||temp>1000){
            printf("ERROR: %s is not a legal number\n",a);
        }
        else{
            sum+=temp;
            num++;
        }
    }
    if(num == 0)
        printf("The average of 0 numbers is Undefined\n");
    else if(num == 1)
        printf("The average of 1 number is %.2f\n", sum);
    else {
        printf("The average of %d numbers is %.2f\n", num, sum / num);
    }
    return 0;
}

上面是参考柳神解答写的代码,但如果较真起来,既然 xx. 为合法,那 .xx 也应该合法才对。以下是考虑着两种情况后,不用sprintf,一个一个情况讨论的AC代码。

#include
#include
int main(){
    double num[100],a,sum=0;
    char temp[100]="\0";
    int n,i,j,len,flag,dot,cnt,k=0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%s",temp);
        len=strlen(temp);
        flag=0;
        dot=0;
        cnt=0;
        for(j=0;j<len;j++){
            if(j==0 && temp[j]!='-' && (temp[j]<'0' || temp[j]>'9')){
                if(temp[j]=='.'){
                    dot=j;
                    cnt++;
                }
                else{
                    flag=1;
                    break;
                }
            }
            else if(j>0 && temp[j]=='.'){
                if(cnt==0){
                    dot=j;
                    cnt++;
                }
                else{
                    flag=1;
                    break;
                }
            }
            else if(j>0 && (temp[j]<'0' || temp[j]>'9')){
                flag=1;
                break;
            }
        }
        if(flag==1){
            printf("ERROR: %s is not a legal number\n",temp);
            continue;
        }
        else if(cnt==1 && dot!=len-3 && dot!=len-2 && dot!=len-1 && dot!=0){
            printf("ERROR: %s is not a legal number\n",temp);
            continue;
        }
        sscanf(temp,"%lf",&a);
        if(a>1000 || a<-1000){
            printf("ERROR: %s is not a legal number\n",temp);
            continue;
        }
        num[k++]=a;
    }
    if(k==0) printf("The average of 0 numbers is Undefined\n");
    else if(k==1) printf("The average of 1 number is %.2f\n",num[0]);
    else{
        for(i=0;i<k;i++){
            sum+=num[i];
        }
        printf("The average of %d numbers is %.2f\n",k,sum/k);
    }
    return 0;
}

你可能感兴趣的:(PAT A/甲级1108 Finding Average 测试点3勘误)