天天看點

1054. 求平均值 (20)

本題的基本要求非常簡單:給定N個實數,計算它們的平均值。但複雜的是有些輸入資料可能是非法的。一個“合法”的輸入是[-1000,1000]區間内的實數,并且最多精确到小數點後2位。當你計算平均值的時候,不能把那些非法的資料算在内。

輸入格式:

輸入第一行給出正整數N(<=100)。随後一行給出N個實數,數字間以一個空格分隔。

輸出格式:

對每個非法輸入,在一行中輸出“ERROR: X is not a legal number”,其中X是輸入。最後在一行中輸出結果:“The average of K numbers is Y”,其中K是合法輸入的個數,Y是它們的平均值,精确到小數點後2位。如果平均值無法計算,則用“Undefined”替換Y。如果K為1,則輸出“The average of 1 number is Y”。

輸入樣例1:

7

5 -3.2 aaa 9999 2.3.4 7.123 2.35

輸出樣例1:

ERROR: aaa is not a legal number

ERROR: 9999 is not a legal number

ERROR: 2.3.4 is not a legal number

ERROR: 7.123 is not a legal number

The average of 3 numbers is 1.38

輸入樣例2:

2

aaa -9999

輸出樣例2:

ERROR: aaa is not a legal number

ERROR: -9999 is not a legal number

The average of 0 numbers is Undefined

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;

int N;
char str[100][100]; 

bool Check(char s[])
{
    int i = 0;

    if(s[0] == '-')
    {
        i ++;
    }

    //整數部分檢測,隻能是數字 
    for(; s[i] && s[i] != '.'; i ++){
        if(!isdigit(s[i])){
            return false;
        }
    }

    //小數部分檢測,隻能是不超過2位的數字
    if(s[i] == '.'){
        for(int j = i + 1; s[j]; j ++){
            if(!isdigit(s[j]) || j - i > 2){
                return false;
            }
        }
    }

    double a = fabs(atof(s));
    //範圍檢測
    if(a > 1000.0)
        return false;

    return true;
}

void solve()
{
    int ans = 0;
    double sum = 0;

    for(int i = 0; i < N; i ++){
        if(Check(str[i])){
            ans ++;
            sum += atof(str[i]);
        }
        else{
            cout << "ERROR: " << str[i] << " is not a legal number" << endl;
        }
    }

    if(ans){
        if(ans == 1)
            printf("The average of 1 number is %.2lf\n", sum);
        else
            printf("The average of %d numbers is %.2lf\n", ans, sum / ans);

    }
    else{
        cout << "The average of 0 numbers is Undefined" << endl;
    }
}

int main()
{
    cin >> N;
    for(int i = 0; i < N; i ++){
        cin >> str[i]; 
    }
    solve();
    return 0;
}           

複制

1054. 求平均值 (20)