【PAT乙級】1054 求平均值
阿新 • • 發佈:2018-12-17
本題的基本要求非常簡單:給定 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; }