1054. 求平均值 (20)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
本题的基本要求非常简单:给定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
思路很简单,逐个用string读入,遍历string,不满足条件的输出,麻烦的就是条件比较繁杂,得一个个敲:
#include <iostream>
#include <string>
#include <cctype>
#include <iomanip>
using namespace std;
int main(){
int n;
cin >> n;
string inp;
int count = 0;
double sumnum = 0.0;
int i = 0;
breakloop: i++;
while(i <= n){
cin >> inp;
double num = 0.0;
int isminus = 0, isdeci = 0;
unsigned j = 0;
int decipo = 0;
if (inp[0] == '-'){
isminus = 1;
j = 1;
}
while (j < inp.size()){
if (isdigit(inp[j]) && !isdeci){
num *= 10.0;
num += (double)(inp[j] - '0');
j++;
} else if (inp[j] == '.' && j != 0){
isdeci++;
j++;
} else if (isdigit(inp[j]) && isdeci == 1){
num *= 10.0;
num += (double)(inp[j] - '0');
decipo++;
if (decipo > 2){
cout << "ERROR: " << inp << " is not a legal number" << endl;
goto breakloop;
}
j++;
} else {
cout << "ERROR: " << inp << " is not a legal number" << endl;
goto breakloop;
}
}
if (decipo != 0){
for (int k = 0; k < decipo; k++)
num *= 0.1;
}
if (isminus)
num = -num;
if (num < -1000 || num > 1000){
cout << "ERROR: " << inp << " is not a legal number" << endl;
goto breakloop;
}
count++;
sumnum += num;
i++;
}
if (count == 0){
cout << "The average of 0 numbers is Undefined";
} else if (count == 1){
cout << "The average of 1 number is " << fixed << setprecision(2) << sumnum;
} else{
cout << "The average of " << count << " numbers is " << fixed << setprecision(2) << sumnum/(double)count;
}
return 0;
}

博客介绍了PAT基本级题目1054,要求计算给定实数的平均值,但需忽略非法输入。非法输入定义为超出[-1000, 1000]区间或小数点后超过两位的数字。文章提供了解题思路,包括如何检查输入合法性并计算平均值。"
105091373,9384290,使用Python栈实现一维消消乐算法,"['数据结构', 'Python', '算法']
3285

被折叠的 条评论
为什么被折叠?



