【JAVA】PAT 乙级 1054 求平均值
题目链接
本题的基本要求非常简单:给定 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
对于数字的输入,要判断是不是在[-1000,1000]这个区间,同时还要看是不是精确到两位小数以内,如样例的7.123是不合法的。用字符串的indexOf获取小数点的位置下标,然后看看小数点位置下标是不是小于字符串的长度-3。
String tem = s[i];
double td = sti(tem);
if (td >= -1000 && td <= 1000) {
int index = tem.indexOf(".");
if (index == -1) {
sum += td;
} else {
if (index < tem.length() - 3) {
count--;
out.println("ERROR: " + tem + " is not a legal number");
} else {
sum += td;
}
}
} else {
count--;
out.println("ERROR: " + tem + " is not a legal number");
}
其他不合法的输入如aaa、2.3.4,可以利用Double.parseDouble()如果不能转换会报错这个条件,利用try捕获异常,在catch里输出ERROR…
String tem = s[i];
try {
double td = sti(tem);
if (td >= -1000 && td <= 1000) {
int index = tem.indexOf(".");
if (index == -1) {
sum += td;
} else {
if (index < tem.length() - 3) {
count--;
out.println("ERROR: " + tem + " is not a legal number");
} else {
sum += td;
}
}
} else {
count--;
out.println("ERROR: " + tem + " is not a legal number");
}
} catch (Exception e) {
count--;
out.println("ERROR: " + tem + " is not a legal number");
}
注意题目说的,如果 K 为 1,则输出 The average of 1 number is Y。
这里是number而不是numbers,这是一个坑点。K为0的时候又是numbers,这里要小心
if (count == 0) {
out.print("The average of 0 numbers is Undefined");
} else if (count == 1) {
out.print("The average of " + count + " number is " + String.format("%.2f", sum));
} else {
double avg = sum / (double) count;
out.print("The average of " + count + " numbers is " + String.format("%.2f", avg));
}
完整代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(bf.readLine());
double sum = 0;
int count = N;
String[] s = bf.readLine().split(" ");
for (int i = 0; i < s.length; i++) {
String tem = s[i];
try {
double td = sti(tem);
if (td >= -1000 && td <= 1000) {
int index = tem.indexOf(".");
if (index == -1) {
sum += td;
} else {
if (index < tem.length() - 3) {
count--;
out.println("ERROR: " + tem + " is not a legal number");
} else {
sum += td;
}
}
} else {
count--;
out.println("ERROR: " + tem + " is not a legal number");
}
} catch (Exception e) {
count--;
out.println("ERROR: " + tem + " is not a legal number");
}
}
if (count == 0) {
out.print("The average of 0 numbers is Undefined");
} else if (count == 1) {
out.print("The average of " + count + " number is " + String.format("%.2f", sum));
} else {
double avg = sum / (double) count;
out.print("The average of " + count + " numbers is " + String.format("%.2f", avg));
}
out.flush();
}
static double sti(String a) {
return Double.parseDouble(a);
}
}