PAT(B) 1054 求平均值(Java)

题目链接:1054 求平均值 (20 point(s))

题目描述

本题的基本要求非常简单:给定 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

测试样例

Case 0:

  • 输入
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
  • 输出
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

Case 1:

  • 输入
2
aaa -9999
  • 输出
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined

Case 2:

  • 输入
1
666
  • 输出
The average of 1 number is 666.00

分析💬

  • 只有 1 个合法实数的时候,单数,输出number,无后缀s
  • 小数部分宽度检查最好直接用长度判断,不要计算,比较大小,或者相减差为 0 。

Java代码

/**********************************************************************************
Submit Time			Status		Score	Problem	Compiler		Run Time	User
8/17/2019, 16:59:01	Accepted	20		1054	Java (openjdk)	84 ms		wowpH
Case 2: 测试只有1个合法输入的情况
Case 3: 测试小数位数超过2位的情况
**********************************************************************************/
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		String[] real = br.readLine().split(" ");		// 实数
		double sum = 0;									// 合法实数的和
		int k = 0;										// 合法实数的个数
		for (int i = 0; i < n; ++i) {
			try {
				double x = Double.parseDouble(real[i]);// 解析成double型不合法抛异常
				int width = 0;							// 小数部分位数
				if (real[i].contains(".")) {			// 是小数
					width = real[i].length() - real[i].indexOf('.') - 1;// 小数位数
				}
				if (x < -1000 || x > 1000 || width > 2) {// 超范围或小数部分过长
					throw new NumberFormatException();
				}
				sum += x;
				++k;
			} catch (NumberFormatException e) {			// 处理异常,输出信息
				System.out.println("ERROR: " + real[i] + " is not a legal number");
			}
		}
		if (0 == k) {									// 无合法实数
			System.out.println("The average of 0 numbers is Undefined");
		} else if (1 == k) {							// 只有1个合法实数
			System.out.printf("The average of 1 number is %.2f", sum);// 单数无s字符
		} else {										// 多个合法实数
			System.out.printf("The average of %d numbers is %.2f", k, sum / k);
		}
	}
}

提交结果

提交结果

posted @ 2019-08-17 17:39  wowpH  阅读(239)  评论(0编辑  收藏  举报