题目
基本任务非常简单:给定 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;
}