黑马程序员技术交流社区

标题: 一道很简单的测试题,楞是让我作难了好多,汗! [打印本页]

作者: 陈兆辉    时间: 2014-9-19 16:17
标题: 一道很简单的测试题,楞是让我作难了好多,汗!
本帖最后由 陈兆辉 于 2014-9-21 20:58 编辑
  1. package com.itheima;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;

  5. /*第三题:
  6. * 从键盘接受一个数字,打印该数字表示的时间,最大单位到天,例如:
  7.         键盘输入6,打印6秒;
  8.         键盘输入60,打印1分;
  9.         键盘输入66,打印1分6秒;
  10.         键盘输入666,打印11分6秒;
  11.         键盘输入3601,打印1小时1秒
  12.         */
  13. public class Test3 {
  14.         //写完才发现写的麻烦了,请见谅!
  15.         //定义三个常量分别代表最大的秒,分,小时表示的数的上限。由于这是测试,就不单独建立一个Constants类了。
  16.         private static final int MAXSECONDS = 60;
  17.         private static final int MAXMINUTES = MAXSECONDS*60;
  18.         private static final int MAXHOURS = MAXMINUTES*24;

  19.         public static void main(String[] args) {
  20.                 //定义一个流对象,读取键盘的录入的字符。会有安全问题:用户输入的不是数字。所以要进行安全检查
  21.                 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  22.                 String buf = null;
  23.                 //读取键盘录入的一行数据
  24.                 try {
  25.                         buf = reader.readLine();                        
  26.                 } catch (IOException e) {
  27.                         e.printStackTrace();
  28.                 }
  29.                 //安全检查,是否含有非法字符
  30.                 if (!buf.matches("[0-9]|[1-9][0-9]+")){
  31.                         throw new RuntimeException("含有非法字符");
  32.                 }        
  33.                 //转成int类型并传入printFormatTime方法中
  34.                 int num = Integer.parseInt(buf);
  35.                 printFomatTime(num);
  36.         }
  37.         
  38.         private static String retSeconds(int num){
  39.                 //为了防止出现类似1分0秒的结果,进行一次判断。
  40.                 if(num==0)
  41.                         return "";
  42.                 return num+"秒";
  43.         }
  44.         
  45.         private static String retMinutes(int num){
  46.                 if(num==0)
  47.                         return "";
  48.                 //num小于最大秒数,则直接传入retSecond(),不判断会出现如0分50秒的错误打印结果
  49.                 if(num<MAXSECONDS)
  50.                         return retSeconds(num);
  51.                 //记录总的分钟数以及剩余秒数,将剩余秒数传入retSecond()
  52.                 int minutes = num/60;
  53.                 int secondsArg = num-minutes*MAXSECONDS;
  54.                 return minutes+"分"+retSeconds(secondsArg);
  55.         }
  56.         
  57.         private static String retHours(int num){
  58.                 if(num==0)
  59.                         return "";
  60.                 if(num<MAXMINUTES)
  61.                         return retMinutes(num);
  62.                 //记录总的分钟数、小时数,将剩余秒数传入retMinutes()
  63.                 int minutes = num/60;
  64.                 int hours = minutes/60;
  65.                 int minutesArgs = num-hours*MAXMINUTES;
  66.                 return hours+"小时"+retMinutes(minutesArgs);
  67.         }
  68.         
  69.         private static void printFomatTime(int num){
  70.                 //防止用户输入0时返回一个"",给人程序没有任何操作的错觉
  71.                 if(num==0){
  72.                         System.out.println("0秒");
  73.                         return;
  74.                 }
  75.                 if(num<MAXHOURS){
  76.                         System.out.println(retHours(num));
  77.                         return;
  78.                 }
  79.                 //记录总的分钟数、小时数、,将剩余秒数传入retMinutes()
  80.                 int minutes = num/60;
  81.                 int hours = minutes/60;
  82.                 int days = hours/24;
  83.                 int hoursArg = num-days*MAXHOURS;
  84.                 System.out.println(days+"天"+retHours(hoursArg));
  85.         }
  86. }
复制代码
看题的时候脑残了,后面发现直接if判断就完了。不错,我就是来混分的,早就答应我的帮我要亲友券的朋友传来消息说要不到了,看着我几十页的手写的笔记,唉,我真的醉了……

作者: 陈兆辉    时间: 2014-9-19 16:23
自己顶!
作者: 杜工    时间: 2014-9-19 16:58
本帖最后由 杜工 于 2014-9-19 17:08 编辑

你这写的也太麻烦了吧.

作者: 陈兆辉    时间: 2014-9-19 17:02
杜工 发表于 2014-9-19 16:58
你这写的也太麻烦了吧。发下我写的。

对啊对啊,我也是写着写着才想起来的,直接if判断就完了,简单很多呢,不过写都写了,就干脆写完了算了。
作者: 不系之舟王    时间: 2014-9-19 21:55
我也抽到这道题了,不过我用的最简单最基础的if语句做的,键盘输入用的Scanner
作者: noiary    时间: 2014-9-19 22:01
不是可以买到嘛...刚买了个- -.
作者: 15579171087    时间: 2014-9-19 23:52
帮顶一下吧
作者: 陈兆辉    时间: 2014-9-20 13:25
noiary 发表于 2014-9-19 22:01
不是可以买到嘛...刚买了个- -.

我前几天刚注册的号,前面因为朋友打包票说可以有的,我就没怎么上论坛。现在一看120黑马币,唉,不说了,都是泪啊
作者: ☆枫の云    时间: 2014-9-20 13:52
能写出来能运行出结果就好,不用太在意细节,有时候有思路有时候没思路这也没个准儿
作者: 舍我其谁    时间: 2014-9-20 14:13
已经做完了,属于发表感应!提问者在问题已解决的情况下,提问者没有结贴,扣除技术分1分。所以感言贴跟提问贴区分开来,你这里发的是提问贴。。。
作者: F@C    时间: 2014-9-20 15:19
进来学习一下
作者: 陈兆辉    时间: 2014-9-20 17:24
舍我其谁 发表于 2014-9-20 14:13
已经做完了,属于发表感应!提问者在问题已解决的情况下,提问者没有结贴,扣除技术分1分。所以感言贴跟提 ...

小弟初来乍到,请见谅。以后会注意的。谢谢!
作者: 陈兆辉    时间: 2014-9-20 17:25
☆枫の云 发表于 2014-9-20 13:52
能写出来能运行出结果就好,不用太在意细节,有时候有思路有时候没思路这也没个准儿 ...

嗯,有理!
作者: 敏敏好学    时间: 2014-9-20 17:26
我也做过这道题    不过你做的确实有点长
作者: 陈兆辉    时间: 2014-9-20 17:28
noiary 发表于 2014-9-19 22:01
不是可以买到嘛...刚买了个- -.

大哥,我这两天才注的号。120黑马币,您是随意了,对我来说还遥远着呢。
作者: 陈兆辉    时间: 2014-9-20 17:31
敏敏好学 发表于 2014-9-20 17:26
我也做过这道题    不过你做的确实有点长

着实是有点长啊!
作者: 天邃任我桓    时间: 2014-9-20 17:31
这写的太复杂了
作者: 神秘人F    时间: 2014-9-20 17:46
是有点写的复杂了。。。。。。
作者: noiary    时间: 2014-9-20 19:35
陈兆辉 发表于 2014-9-20 17:28
大哥,我这两天才注的号。120黑马币,您是随意了,对我来说还遥远着呢。 ...

每天10分  10天应该还来得及 {:3_57:}
作者: noiary    时间: 2014-9-20 22:24
noiary 发表于 2014-9-20 19:35
每天10分  10天应该还来得及

每天登陆拿1饭呢

评论5条拿5分,有时候能多拿两分?  不过第二天不能一次性5分了好像..一直混乱中,

发两个帖子,拿4分.  

具体没研究过规律,基本每天能拿到10分,偶尔帖子被好心管理员看中会加技术分..

有时候也被土豪送分- -.
作者: 落幕繁华    时间: 2014-9-20 22:51
直接if可以?我以为是输入任何数字都打印出多少天多少小时什么什么的
作者: Fightin黑马    时间: 2014-9-20 23:03
public class Test4 {

        public static void main(String[] args) {
               
                while (true) {                                                                                                                                                       
                        System.out.println("请输入一个数字(quit结束):");                                                 //提示用户输入数字,用户自主决定是否退出程序
                        Scanner sc = new Scanner(System.in);                                                                 //新建一个Scanner对象
                        long time = 0;                                                                                                 //定义变量time接收输入的数字初始化为0;
                        //使用try...catch 来处理用户输入的数据,是数字则正常执行,非数字则提示重新输入数字
                        try {               
                                String line = sc.nextLine();                                                                        //接收数字
                                if("quit".equals(line)){                                                                                //用户输入quit时结束循环退出程序;
                                        System.out.println("谢谢使用,再见!");
                                        break;
                                }
                                time=Long.parseLong(line);
                                long   day             =  time / 86400;                                                                                //天的数值
                                long   hour             = (time / 3600)%24;                                                                        //时的数值
                                long   minute         = (time / 60)%60;                                                                                //分的数值       
                                long   second         =  time %60;                                                                                        //秒的数值
                               
                                String []  string= new  String[4];                                                                                //定义字符串数组用来让单位和对应数值连接
                                        string[0] =          day                ==0        ?        ""        :         day                + "天";
                                        string[1] =          hour                ==0        ?        ""        :        hour                + "小时";
                                        string[2] =  minute        ==0        ?        ""        :         minute        + "分";
                                        string[3] =  second        ==0        ?        ""        :         second        + "秒";

                                for (int i = 0; i < string.length; i++) {                                                                        //打印输入数字对应的时间
                                        System.out.print(string[i]);
                                }
                                System.out.println();
                                continue;
                       
                        } catch (Exception e) {                                                                                                                       
                                System.out.println("您输入的不是数字,请输入数字:");                        //输入的是非数字时让用户重新输入数字
                        }
                       
                }
               
        }
}


作者: yinzhenyu    时间: 2014-9-20 23:11
我也准备的迟了,努力奋斗中!!
作者: 陈兆辉    时间: 2014-9-20 23:54
noiary 发表于 2014-9-20 22:24
每天登陆拿1饭呢

评论5条拿5分,有时候能多拿两分?  不过第二天不能一次性5分了好像..一直混乱中,

评论就是指点评么?怎么感觉点评从来没加分过?还有,是必须在这个技术交流区点评和回复才给分的么,还是任意区域都行?话说那个社区门户一直没看懂啊,怎么感觉没什么用的说。发起分享你用过没?
作者: luofeng    时间: 2014-9-21 00:14
舍我其谁 发表于 2014-9-20 14:13
已经做完了,属于发表感应!提问者在问题已解决的情况下,提问者没有结贴,扣除技术分1分。所以感言贴跟提 ...

怎么算结贴?
作者: 舍我其谁    时间: 2014-9-21 09:28
luofeng 发表于 2014-9-21 00:14
怎么算结贴?

将帖子改为提问结束
作者: noiary    时间: 2014-9-21 11:55
陈兆辉 发表于 2014-9-20 23:54
评论就是指点评么?怎么感觉点评从来没加分过?还有,是必须在这个技术交流区点评和回复才给分的么,还是 ...

一直不晓得分享是啥..  评论就像我们现在这样,点评应该也算.
作者: 陈兆辉    时间: 2014-9-21 12:26
noiary 发表于 2014-9-21 11:55
一直不晓得分享是啥..  评论就像我们现在这样,点评应该也算.

谢啦。兄弟!
作者: 仰望星空.....    时间: 2014-9-22 00:04
路过,来看看




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2