题目
基本任务非常简单:给定 N 个实数,请你计算它们的平均值。
但是令事情变得复杂的是,某些输入数字可能不合法。
合法输入数字指 [−1000,1000] 范围内的精确到不超过 2 个小数位的实数。
在计算平均值时,不得将这些非法数字计算在内。
输入格式
第一行包含整数 N。
第二行包含 N 个输入数字,数字之间用空格隔开。
输出格式
按照输入的顺序,对于每个输入的非法数字,在一行中输出 ERROR: X is not a legal number,其中 X 是非法输入。
最后一行,输出 The average of K numbers is Y,其中 K 是合法输入的数量,Y 是它们的平均值,注意保留两位小数。
如果平均值无法计算,则将 Y 替换为 Undefined。
如果 K 仅为 1,则输出 The average of 1 number is Y。
数据范围
1≤N≤1000
输入样例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
解法:模拟
可以用stof尝试将字符串转化成浮点数,并且用try catch语句捕捉异常
时间复杂度O(n),空间复杂度O(1)
#include <iostream>using namespace std;int main() {int n;cin >> n;double sum = 0;int cnt = 0;while (n--) {string s;cin >> s;double x;bool flag = true;try {size_t idx;x = stof(s, &idx);if (idx < s.size()) flag = false;}catch(...) {flag = false;}if (x < -1000 || x > 1000) flag = false;int k = s.find('.');if (k != -1 && s.size() - k > 3) flag = false;if (flag) cnt += 1, sum += x;else printf("ERROR: %s is not a legal number\n", s.c_str());}if (cnt > 1) printf("The average of %d numbers is %.2lf", cnt, sum / cnt);else if (cnt == 1) printf("The average of 1 number is %.2lf", sum);else puts("The average of 0 numbers is Undefined");return 0;}
