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

  1. 7
  2. 5 -3.2 aaa 9999 2.3.4 7.123 2.35

输出样例1:

  1. ERROR: aaa is not a legal number
  2. ERROR: 9999 is not a legal number
  3. ERROR: 2.3.4 is not a legal number
  4. ERROR: 7.123 is not a legal number
  5. The average of 3 numbers is 1.38

输入样例2:

  1. 2
  2. aaa -9999

输出样例2:

  1. ERROR: aaa is not a legal number
  2. ERROR: -9999 is not a legal number
  3. The average of 0 numbers is Undefined
  4.  
  5. 方法一
  1. package com.hone.basical;
  2.  
  3. import java.text.DecimalFormat;
  4. import java.util.Scanner;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7.  
  8. /**
  9. * 原题目:https://www.patest.cn/contests/pat-b-practise/1054
  10. * @author Xia
  11. * 注意:1、合法数字个数是0的时候The average of 0 numbers is Undefined
  12. * 2、合法数字个数是1的时候 要输出The average of 1 number is Y
  13. */
  14.  
  15. public class basicalLevel1054average {
  16.  
  17. public static void main(String[] args) {
  18. Scanner in = new Scanner(System.in);
  19. int N = in.nextInt();
  20.  
  21. double total = 0;
  22. int totalNum = 0;
  23. //整理思路利用正则表达式判断输入的是否是位于[-1000,1000]之间,
  24. //最多精确到小数点后2位的数字
  25. for (int i = 0; i < N; i++) {
  26. String mayNum = in.next();
  27. if (isNum(mayNum)) { //如果是数字
  28. double num =Double.parseDouble(mayNum);
  29. if (num<=1000&&num>=-1000) {
  30. total+=Double.parseDouble(mayNum);
  31. totalNum++;
  32. }else {
  33. System.out.println("ERROR: "+mayNum +" is not a legal number");
  34. }
  35. }else {
  36. System.out.println("ERROR: "+mayNum +" is not a legal number");
  37. }
  38. }
  39. if (totalNum>1) {
  40. DecimalFormat df =new DecimalFormat("##0.00");
  41. String sp = df.format(total/(double)totalNum);
  42. System.out.println("The average of "+totalNum +" numbers is "
  43. +sp);
  44. }else if (totalNum == 1) {
  45. System.out.printf("The average of %.0f number is %.2f\n", totalNum, total / totalNum);
  46. }else {
  47. System.out.println("The average of 0 numbers is Undefined");
  48. }
  49.  
  50. }
  51.  
  52. //定义函数判断是否是合法的数字
  53. public static boolean isNum(String str){
  54. String p = "((\\-?)(\\d+))(\\.(\\d){0,2})?";
  55. Pattern pattern = Pattern.compile(p);
  56. Matcher isNum = pattern.matcher(str);
  57. if (!isNum.matches()) {
  58. return false;
  59. }
  60. return true;
  61. }
  62. }

方法2

  1. package com.hone.basical;
  2.  
  3. import java.util.Scanner;
  4.  
  5. /*
  6. * 来源:http://blog.csdn.net/qq_34594236/article/details/51714618
  7. * 思路:
  8. * 1.因为输入数字不一定是合法的 所以不能用nextDouble();
  9. * 2.所以这里采用字符串输入
  10. * 3.将字符串转变成double型数,如果无法转换(即非法数)则捕捉异常,输出相应语句
  11. * 4.如果该字符串能转变成double型数,则进一步判断是否为合法数(题目规定-1000<=x<=1000 ,并且最多精确到小数点后2位);
  12. * 5.这里介绍主要介绍两种判断是否最多是2位小数
  13. * 第一种:将数字转换成精确到2位小数,求与原来的作差的绝对值;如果是0则符合,否则多余2位(该方法不是很严谨)如果输入数据是1.000000则该数字也合法,显然是错误的,但是测试数据没有这类型数据
  14. * 第二种:将字符串长度-“.”的位置-1;即可算出小数点后有几位数字
  15. * 这里面需要灵活的利用java中的try——catch机制
  16. */
  17.  
  18. public class basicalLevel1054average2 {
  19. public static void main(String[] args) {
  20. Scanner sc = new Scanner(System.in);
  21. int n = sc.nextInt();
  22. sc.nextLine();
  23. String s = sc.nextLine();
  24.  
  25. String[] number = s.split(" ");
  26.  
  27. double sum = 0;
  28. double counts = 0;
  29. for (int i = 0; i < n; i++) {
  30. try {
  31. double x = Double.parseDouble(number[i]);
  32. int times = 0;
  33. if (number[i].contains(".")) {
  34. times = number[i].length() - number[i].indexOf(".") - 1;
  35. }
  36. if (x >= -1000 && x <= 1000 && times <= 2 && times >= 0) {
  37. sum += x;
  38. counts++;
  39. } else {
  40. throw new Exception();
  41. }
  42. } catch (Exception e) {
  43. System.out.printf("ERROR: %s is not a legal number\n", number[i]);
  44. }
  45. }
  46.  
  47. if (counts == 0) {
  48. System.out.printf("The average of %.0f numbers is Undefined", counts);
  49. } else if (counts == 1) {
  50. System.out.printf("The average of %.0f number is %.2f\n", counts, sum / counts);
  51. } else {
  52. System.out.printf("The average of %.0f numbers is %.2f\n", counts, sum / counts);
  53. }
  54.  
  55. }
  56. }
  1.  

PAT——1054. 求平均值的更多相关文章

  1. PAT 1054 求平均值 (20)(代码+思路+测试用例)

    1054 求平均值 (20)(20 分) 本题的基本要求非常简单:给定N个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个"合法"的输入是[-1000,1000]区 ...

  2. PAT 1054 求平均值

    https://pintia.cn/problem-sets/994805260223102976/problems/994805272659214336 本题的基本要求非常简单:给定N个实数,计算它 ...

  3. PAT 1054. 求平均值 (20)

    本题的基本要求非常简单:给定N个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个“合法”的输入是[-1000,1000]区间内的实数,并且最多精确到小数点后2位.当你计算平均值的时候, ...

  4. 1054. 求平均值 (20)-PAT乙级真题

    今天刚刚到学校,2017年学习正式开始了,今天看到了浙大的<数据结构>这学期又要开课了,决定一定要跟着学习一遍:在大学生mooc网上学习:http://www.icourse163.org ...

  5. PAT (Basic Level) Practice (中文)1054 求平均值 (20 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1054 求平均值 (20 分) 题目描述 本题的基本要求非常简单:给定 N 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的 ...

  6. PAT 乙级 1054 求平均值 (20) C++版

    1054. 求平均值 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题的基本要求非常简单:给定N个实 ...

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

    题目链接:1054 求平均值 (20 point(s)) 题目描述 本题的基本要求非常简单:给定 N 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个"合法"的输 ...

  8. PAT-乙级-1054. 求平均值 (20)

    1054. 求平均值 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题的基本要求非常简单:给定N个实 ...

  9. 1054 求平均值 (20 分)C语言

    本题的基本要求非常简单:给定 N 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个"合法"的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 ...

随机推荐

  1. hdu 2412 Party at Hali-Bula 经典树形DP

    Party at Hali-Bula Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. xshell ssh连接linux时提示ssh服务器拒绝了密码

    用Xshell root连接时显示ssh服务器拒绝了密码,应该是应该是sshd的设置不允许root用户用密码远程登录 修改 /etc/ssh/sshd_config文件,注意,安装了openssh才会 ...

  3. eclipse中编写运行c/c++

    注意:此过程有点复杂 准备:1.MinGW:c/c++运行环境: 2.CDT 1.MinGW:安装程序:http://sourceforge.net/projects/mingw/?source=ty ...

  4. js事件队列

    前面跟网友讨论到了JS的事件队列 ,对这个有了一些理解,事件队列我认为就是把一些不按顺序执行的事件放到队列里面,然后按照自己制定的顺序去执行,那么什么情况下会用到这个呢?我首先想到的是动画,动画是会执 ...

  5. js在ie6下的一个bug—未结束标签的错误

    在IE6下,如果在body标签没结束前,用代码获取body对象就会出现错误.如: <html> <head> <script type="text/javasc ...

  6. redis 序列化get、set获取不到原因记录

    最近项目里面出现了个bug,把数据从数据库中读取后又存取到redis里面,之后再读取.奇怪的是,有一个 字段读取不到. public class Circle { private String id; ...

  7. 第一个JavaScript代码

    既然我们的CSS就必须要要放再专门的style标签内  那么javascript也需要放在子级的标签内,那就是script标签内 在页面中,我们可以在body标签中放入<script type= ...

  8. 简说MVC Filter

    Filter与FilterProvider之间的关系 根据用途和执行时机的不同,MVC主要分为以下5种类型的过虑器:AuthenticationFilter.AuthorizationFilter.A ...

  9. [翻译] MGConferenceDatePicker

    MGConferenceDatePicker https://github.com/matteogobbi/MGConferenceDatePicker MGConferenceDatePicker ...

  10. HTML简单框架网页制作 吴昊