【JAVA】PAT 乙级 1054 求平均值

本文详细解析了PAT乙级1054题目的算法实现,包括如何筛选合法数值、计算平均值及处理异常输入,提供完整的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值