1054 求平均值
分数 20
作者 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
代码长度限制16 KB;时间限制400 ms;内存限制64 MB
本题关键在于识别符合题意的数字。刚做的时候,让我很头大啊,情况好多啊,怎么判别啊?要写一堆的if-else?
转念一想,这不是学过编译原理嘛,这让我回想起词法分析,于是我就想可以借助状态图识别。
然后代码就按照这个状态图,思路就清晰多了。不过这里只能识别出数字,没有区分[-1000,1000]
所以识别出来后好要判断下是否在此区间。
好了,不说废话,上代码(Java).
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Main {
static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
input.nextLine();
String str = input.nextLine();
String[] s = str.split(" ");
List<String> number = new ArrayList<>();
double sum = 0.0;
StringBuilder sb = new StringBuilder();
for(String s1 :s){
if(isNumber(s1)){
double n = Double.parseDouble(s1);
if(n >= -1000 && n <= 1000){
number.add(s1);
sum += n;
}else{
sb.append("ERROR: ").append(s1).append(" is not a legal number\n");
}
}
else{
sb.append("ERROR: ").append(s1).append(" is not a legal number\n");
}
}
sb.append("The average of ").append(number.size()).append(" number");
if(number.size() == 0) {
System.out.println(sb+"s is Undefined");
}else {
if(number.size() != 1){
sb.append("s");
}
sb.append(" is ");
System.out.printf(sb +"%.2f\n",sum / number.size());
}
}
public static boolean isNumber(String str){
char state = 0;
int i = 0;
while(state < 6 && i < str.length()){
char c = str.charAt(i++);
switch (state){
case 0:{
if(c == '-')
state = 1;
else if(c >= '0' && c <= '9')
state = 2;
else
state = 6;
}break;
case 1:{
if(c >= '0' && c <= '9')
state = 2;
else
state = 6;
}break;
case 2:{
if(c >= '0' && c <= '9')
state = 2;
else if(c == '.')
state = 3;
else
state = 6;
}break;
case 3:{
if(c >= '0' && c <= '9')
state = 4;
else
state = 6;
}break;
case 4:{
if(c >= '0' && c <= '9')
state = 5;
else
state = 6;
}break;
case 5:{
state = 6;
}break;
default:break;
}
}
return state != 6;
}
}