1054 求平均值 (20分) java题解

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

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

思路:因为我们在处理键盘输入的数据时候,输入的数据即可能是文本信息,也可能是浮点数,所有我们必须判断当前的数字是否可以转换成浮点型。若使用if…else…语句来判断,代码就会变得非常复杂,在java中,与if…else…语句具有相类似的性质还有try…catch…语句,首先,我们不管当前的数据是否可以转换成浮点型,我们都将其转成浮点型,如果当前处理的是文本字符串,程序就会抛出异常,这时候我们就可以把处理文本字符串的代码放在catch内。

题解有两个容易忽略的地方:
<1> 如果平均值无法计算,则用 Undefined 替换 Y。也就是输出:The average of 0 numbers is Undefined
<2> 1. 和 1.0 是等价的

满分代码:

import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		double numDouble;
		String numStr;
		int decimalLength = 0;
		double sum = 0;
		
		int counts = 0;
		
		for(int i=0; i<n; i++) {
			numStr = sc.next();
			try {//用try...catch...的方式来处理表示非浮点数的情况
				numDouble = Double.parseDouble(numStr);
				decimalLength = numStr.length()-numStr.indexOf('.')-1;
				if(numStr.contains(".")) {
					if(decimalLength>2 || decimalLength<0 || numDouble<-1000 || numDouble>1000) { //注意:decimalLength<0不能写成了 decimalLength<=0
						System.out.printf("ERROR: %s is not a legal number\n", numStr);
					}else {
						sum += numDouble;
						counts++;
					}
				}else {
					if(numDouble<-1000 || numDouble>1000) {
						System.out.printf("ERROR: %s is not a legal number\n", numStr);
					}else {
						sum += numDouble;
						counts++;
					}
				}
				
			}catch(Exception e){
				System.out.printf("ERROR: %s is not a legal number\n", numStr);
			}
		}
		sc.close();
		
		if(counts==0) {
			System.out.printf("The average of 0 numbers is Undefined\n");
		}else if(counts==1) {
			System.out.printf("The average of 1 number is %.2f\n", sum);
		}else{
			System.out.printf("The average of %d numbers is %.2f\n", counts, sum/counts);
		}
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值