一只干饭猿
2021-12-15 20:50
采纳率: 60%
浏览 39

浙大PAT乙级1054-测试点2

代码如下:
请问为何第45行需要atof测试点2才能正确,但是atoi不行?
我的思路是在这个else当中小数点个数为0了,如果整数部分有数字,那么字符串就是个整数了,只需要atoi即可。

//一个“合法”的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int isLegal(char a[]){
    int i,len = strlen(a);
    int isNegative = 0;//是否是负数
    int ispoint = 0;//有几个小数点
    int num_xs = 0;//小数的位数
    int num_zs = 0;//整数的位数
    for (i=0;i<len;i++)
    {
        if (i==0 && a[i]=='-')
            isNegative = 1;//是负数
        else if (a[i]>47 && a[i]<59)
        {
            if (ispoint==1)
                num_xs++;
            else if (ispoint==0)
                num_zs++;
            else//多个小数点是错误的
                return 0;
        }
        else if (a[i]=='.')
        {
            ispoint++;
            if (ispoint>1)
                return 0;
        }
        else
            return 0;
    }
    if (ispoint>1)
        return 0;
    else if (ispoint==1)//小数点前后均不允许没有数字,且该实数需要满足范围
    {
        if (num_zs>0 && num_xs<3 && abs(atof(a))<=1000)
            //小数点需要整数位,小数位数不得超过2,[−1000,1000]
            return 1;
        else
            return 0;
    }
    else//没有小数点
    {
        if (num_zs>0 && abs(atof(a))<=1000)//要有数字,排除仅为负号的情况
            return 1;
        else
            return 0;
    }
}

int main(){
    int N,i,k = 0;
    char temp[10001];
    long double sum = 0;
    scanf("%d",&N);
    for (i=0;i<N;i++)
    {
        scanf("%s",temp);
        if (isLegal(temp)==1)
        {
            sum+=atof(temp);
            k++;
        }
        else
            printf("ERROR: %s is not a legal number\n",temp);
    }
    if (k==0)
        printf("The average of 0 numbers is Undefined\n");
    else if (k==1)
        printf("The average of 1 number is %0.2llf\n",sum);//精确到小数点后 2 位
    else
        printf("The average of %d numbers is %0.2llf\n",k,sum/k);
    return 0;
}

2条回答 默认 最新

相关推荐 更多相似问题