1. 程式人生 > >【PAT乙級】1054 求平均值

【PAT乙級】1054 求平均值

本題的基本要求非常簡單:給定 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 <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#define ll long long
#define ep 1e-2
const int maxn = 105;
const double weight[2] = {0.1, 0.01};

using namespace std;

double check(string num, int &cnt) {
    double ret = 0.0;
    bool neg_flag = false, point_flag = false, is_number = true;
    int len = int(num.length()), point_pos = 0;
    //檢查是否是數字
    for (int i = 0; i < len; i ++) {
        if (num[i] == '-') {
            if (i == 0 && len != 1 && !neg_flag) {
                neg_flag = true;
                continue;
            }
            else {
                is_number = false;
                break;
            }
        }
        if (num[i] == '.') {
            //允許.3和3.這種形式
            if (point_flag || len-i-1 > 2) {
                is_number = false;
                break;
            }
            point_flag = true;
            point_pos = i;
            continue;
        }
        if (!((num[i] >= '0' && num[i] <= '9') || num[i] == '.' || num[i] == '-')) {
            is_number = false;
            break;
        }
    }
    //如果不是數字
    if (!is_number) {
        cout << "ERROR: " << num << " is not a legal number" << endl;
    }
    //如果是數字,計算數字的值
    else {
        cnt ++;
        //小數
        if (point_flag) {
            for (int i = 0; i < len; i ++) {
                if (i < point_pos && num[i] >= '0' && num[i] <= '9')
                    ret = ret*10 + (num[i]-'0');
                else if (i > point_pos && num[i] >= '0' && num[i] <= '9')
                    ret += weight[i-point_pos-1] * (num[i]-'0');
            }
        }
        //整數
        else {
            for (int i = 0; i < len; i ++) {
                if (num[i] >= '0' && num[i] <= '9')
                    ret = ret*10 + (num[i]-'0');
            }
        }
    }
    //檢查範圍
    if (ret > 1000) {
        cnt --;
        cout << "ERROR: " << num << " is not a legal number" << endl;
        return 0;
    }
    // 負數轉換
    if (neg_flag) {
        ret *= -1;
    }
    
    return  ret;
}

int main() {
    string nums_str[maxn];
    int n;

    cin >> n;
    for (int i = 0; i < n; i ++) {
        cin >> nums_str[i];
    }

    int cnt = 0;
    double sum = 0;
    for (int i = 0; i < n; i ++) {
        sum += check(nums_str[i], cnt);
    }

    //注意順序!!!!! 第一種情況和第二種反過來放就進入不了cnt == 1的情況!!
    if (cnt == 1) {
        printf("The average of %d number is %.2lf", cnt, sum / cnt);
    }
    else if (cnt > 0) {
        printf("The average of %d numbers is %.2lf", cnt, sum / cnt);
    }
    else {
        printf("The average of 0 numbers is Undefined");
    }

    return 0;
}