PAT A1108 Finding Average (20 分) 字符串

     题目大意:给出N个字符串,从中找出绝对值不超过2000,小数位数2位以内的数字,计算它们的平均值。

     主要是判断字符串是否合法以及数字是否合法的问题。① 包含非数字字符和负号、小数点字符的字符串非法。 ② 小数点超过1个的字符串非法。③ 负号不在首位的字符串非法。 ④ 有小数点,并且小数位数超过2位的非法。 ⑤ 绝对值大于1000的数非法。 其中当心第四个条件的判断,如果用 find()函数,要检验返回的是否是 npos,或者检查小数点是否有一个,否则判断小数位数会出错(测试点3)。

AC代码:

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

bool isValid(char c)
{
    if((c >= '0' && c <= '9') || c == '.' || c == '-') return true;
    return false;
}

bool isLegal(string str)
{
    int pointCnt = 0;
    for (int i = 0; i < str.size(); ++i)
    {
        if(!isValid(str[i])) return false;
        if(i > 0 && str[i] == '-') return false;
        if(str[i] == '.') 
        {
            if(++pointCnt > 1) return false;
        }
    }
    int pointPos = str.find(".");
    if(pointCnt == 1 && str.size() - 1 - pointPos > 2) return false;
    if(abs(stod(str)) > 1000) return false;
    return true;
}

int main()
{
    int N;
    cin >> N;
    double sum = 0;
    int cnt = 0;
    for (int i = 0; i < N; ++i)
    {
        string str;
        cin >> str;
        if(!isLegal(str)) printf("ERROR: %s is not a legal number\n", str.c_str());
        else
        {
            sum += stod(str);
            cnt++;
        }
    }
    if(cnt == 0) printf("The average of 0 numbers is Undefined");
    else if(cnt == 1) printf("The average of 1 number is %.2f", sum);
    else printf("The average of %d numbers is %.2f", cnt, sum / cnt);
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值