黑马程序员技术交流社区

标题: 关于入学测试的一道题目 [打印本页]

作者: MR.Sun    时间: 2014-10-3 22:03
标题: 关于入学测试的一道题目
/*
3、 从键盘接受一个数字,打印该数字表示的时间,最大单位到天,例如:
                键盘输入6,打印6秒;
                键盘输入60,打印1分;
                键盘输入66,打印1分6秒;
                键盘输入666,打印11分6秒;
                键盘输入3601,打印1小时1秒
*/    不知道有没有更简单的方法。。。目测现在才学完函数。。。。
import java.util.*;
class  Test
{
        public static final int SECOND_MINUTE=60;                                        //一分钟的秒数
        public static final int SECOND_HOUR=3600;                                        //一小时的秒数
        public static final int SECOND_DAY=86400;                                //        一天的秒数
        public static void main(String[] args)
        {
                Scanner sc=new Scanner(System.in);
                sop("请输入一个数字:");
                int time=sc.nextInt();
                sop(style(time));
        }

        public static void sop(String str)
        {
                System.out.println(str);
        }
        //总体函数
        public static String style(int time)
        {
                        String str;
                        if (time>=0&&time<SECOND_MINUTE)
                        {
                                        str=time+"秒";
                        }
                        else if (time>=SECOND_MINUTE&&time<SECOND_HOUR)
                        {
                                str=styleMinute(time);        //当在这个范围的时候,就调用分钟格式!
                        }
                        else if (time>=SECOND_HOUR&&time<SECOND_DAY)
                        {
                                str=styleHour(time);                        //当time的值在这个范围的时候就调用小时的格式!
                        }
                        else if (time>=SECOND_DAY)
                        {
                                str=styleDay(time);                        //当time 的值大于SECOND_DAY的时候,就开始调用天的格式!
                        }
                        else
                        {
                                str="超过规定数值,无法计算!";
                        }
                                return str;
        }
        //分钟格式!
        public static String  styleMinute(int time)
        {
                        int minute,second;
                        minute=time/SECOND_MINUTE;
                        second=time%SECOND_MINUTE;
                        if (second==0)
                        {
                                return second+"秒";
                        }
                                else
                        {
                                return minute+"分"+second+"秒";
                        }
        }
        //小时的格式!
        public static String styleHour(int time)
        {
                int hour,second;
                second=time%SECOND_HOUR;
                hour=time/SECOND_HOUR;
                if (second==0)
                {
                        return hour+"小时";
                }
                else
                {
                        return hour+"小时"+style(second);
                }
        }
        //天的格式!
        public static String styleDay(int time)
        {
                int day,hour,minute,second;
                second=time%SECOND_DAY;
                day=time/SECOND_DAY;
                if (second==0)
                {
                        return day+"天";
                }
                else
                {
                        return day+"天"+style(second);
                }
        }
}       


作者: 鲁行    时间: 2014-10-3 22:58
/*
3、 从键盘接受一个数字,打印该数字表示的时间,最大单位到天,例如:
                键盘输入6,打印6秒;
                键盘输入60,打印1分;
                键盘输入66,打印1分6秒;
                键盘输入666,打印11分6秒;
                键盘输入3601,打印1小时1秒
*/   
import java.util.Scanner;
class  Test
{
                public static void main(String[] args)
                {
                        int d,h,min,s;
                        Scanner sc = new Scanner(System.in);
                        int num = sc.nextInt();
                       
        /*此算法效率不高,因为每次都要算天数,如果输入的秒数小于86400(一天的秒数)
                实际上可以不用算天数,算小时也是一样的.请楼主自己改进.

                其实,本题目的思想很简单,就比如给你一个3位数,怎么得到它的百位,十位和个位上的数字.

                想要得到百位上的数,就要除以100,十位上的数就是这个数减去百位乘以100再除以10.余数就是个位.
        */
                        d=num/(60*60*24);//除以一天的秒数得到天数.
                        h=(num-d*(60*60*24))/(60*60);//减去d天的秒数,再除以3600s得到小时数.
                        min=(num-d*(60*60*24)-h*(60*60))/60;//减去前面的天和小时,得到分钟数.
                        s=num%60;//对60取摸,可以直接得到秒数.

                        if(d!=0)
                                System.out.println(d+"天"+h+"小时"+min+"分"+s+"秒");
                        else if(d==0&&h!=0)
                                System.out.println(h+"小时"+min+"分"+s+"秒");
                        else if(d==0&&h==0)
                                System.out.println(min+"分"+s+"秒");
                        else
                                System.out.println(s+"秒");                       
         }
}
作者: 高泳    时间: 2014-10-3 23:23
写的好细
作者: hollywood2014    时间: 2014-10-3 23:25
import java.util.Scanner;
public class Test_01 {

        public static void main(String[] args) {
               
       Scanner input=new Scanner(System.in);
       System.out.println("Please input a Integer: ");
       int in=input.nextInt();
       if(in>=0)
       {
               printTime(in);
       }
       else
       {
               System.out.println("Please make the number positive");
       }
      
        }
         static void printTime(int in)
         {
                 int hours=in/3600;
                 int minutes=in/60;
                 int seconds=in%60;   //特别需要注意的是,用户输入3600,要排除输出为1小时60分钟的情况
                 if(hours>0)          //基本思路是,当小时不为0时,要对分钟取余,当分钟不为0时,要对秒取余
                 {
                         if((minutes%60)>0)
                         {
                                 if(seconds>0)
                                 {
                                     System.out.println(hours+"小时"+minutes+"分钟"+seconds+"秒");     
                                 }
                                 else
                                 {
                                         System.out.println(hours+"小时"+minutes+"分钟");
                                 }
                         }
                         else
                         {

                                 if(seconds>0)
                                 {
                                     System.out.println(hours+"小时"+seconds+"秒");     
                                 }
                                 else
                                 {
                                         System.out.println(hours+"小时");
                                 }
                         }
                 }
                 else
                 {
                         if(minutes>0)
                         {
                                 if(seconds>0)
                                 {
                                     System.out.println(minutes+"分钟"+seconds+"秒");     
                                 }
                                 else
                                 {
                                         System.out.println(minutes+"分钟");
                                 }
                     }
                         else
                         {
                                 System.out.println(seconds+"秒");
                         }
             }
         }
}
小弟有简单方法,基本是C语言的逻辑,但是没有考虑到天数
作者: mengzi987    时间: 2014-10-3 23:52
很难啊!:handshake
作者: 张周飞    时间: 2014-10-4 10:15
受教了!!!
作者: date1130    时间: 2014-10-4 10:31
受益颇多呀。
作者: 李天富    时间: 2014-10-4 11:52
  1. import java.util.*;
  2. class  timetest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int time = new Scanner(System.in).nextInt();
  7.                 transTime(time);
  8.         }
  9.         public static void transTime(int num)
  10.         {
  11.                 String[] unit={"天","时","分","秒"};
  12.                 int[] time=new int[4];
  13.                 int temp=0;
  14.                 time[0]=num/86400;
  15.                     //获取天数。
  16.                 temp=num%86400;
  17.                 time[1]=temp/3600;
  18.                         //获取小时数。
  19.                 temp=temp%3600;
  20.                 time[2]=temp/60;
  21.                         //获取分钟数。
  22.                 time[3]=temp%60;
  23.                         //获取秒数。
  24.                 for (int i=0;i<4 ;i++ )
  25.                 {
  26.                         if(i!=3&&time[i]==0)
  27.                                 //除了0秒,其他单位上数值是0的时候不打印该单位。
  28.                                 continue;
  29.                         System.out.print(time[i]+unit[i]);
  30.                 }
  31.         }
  32. }
复制代码

作者: FlyFish    时间: 2014-10-4 12:23
有点高深
作者: 沙拉很好吃    时间: 2014-10-4 13:08
学习学习!
作者: xiaomin1992    时间: 2014-10-4 14:30
#include<iostream>
using namespace std;

void main()
{
        int a[4]={0};
        int i,j=0;
       
        while(cin>>i)     //计算时间
        {
                j=0;
    a[0]=i;
        while(j<3)
        {
                if(j==2)
                {
                        a[j+1]= a[j]/24;
                        a[j]  = a[j]%24;
                }
                else
                {
                        a[j+1]= a[j]/60;
                        a[j]  = a[j]%60;
                }
                j++;
        }

        for(i=3;i>=0;i--)     //输出
        {
                if(a[i]!=0)
                {
               
                        cout<<a[i];
                        switch(i)
                        {
                        case 0:
                                        cout<<"秒";
                                        break;
                        case 1:
                                cout<<"分";
                                break;
                        case 2:
                                cout<<"时";
                                break;
                        case 3:
                                cout<<"天";
                                break;
                        }
                }

        }
        cout<<endl;
        memset(a,0,sizeof(a));
        }
}

用c++写了个。试试玩玩。没有优化的
作者: MR.Sun    时间: 2014-10-4 21:52
鲁行 发表于 2014-10-3 22:58
/*
3、 从键盘接受一个数字,打印该数字表示的时间,最大单位到天,例如:
                键盘输入6,打 ...

厉害。。真是多谢了啊。。。。
作者: MR.Sun    时间: 2014-10-4 21:53
hollywood2014 发表于 2014-10-3 23:25
import java.util.Scanner;
public class Test_01 {

多谢多谢。。
作者: 九零零    时间: 2014-10-4 22:13
大神都蛮给力的
作者: 戏言丶    时间: 2014-10-5 01:07
8楼的不错
作者: 马嘉    时间: 2014-10-5 16:04
Scanner sc=new Scanner(System.in);
我想问一下,Scanner是在哪里学到的,我现在完全没印象了,求楼主告诉我一声
作者: MR.Sun    时间: 2014-10-5 21:58
马嘉 发表于 2014-10-5 16:04
Scanner sc=new Scanner(System.in);
我想问一下,Scanner是在哪里学到的,我现在完全没印象了,求楼主告诉 ...

我一个朋友在传智上过基础班,我看的视频就是他们上课的时候录得,那上面有这个。目前也只知道这个从键盘输入的方式。:lol
作者: luofeng    时间: 2014-10-5 23:17
这个不是基础测试的题吗
作者: mudao    时间: 2014-10-5 23:29
可以看懂,感觉不难。不过要写起来就没有楼主的条理清晰了!
作者: 马嘉    时间: 2014-10-6 07:41
MR.Sun 发表于 2014-10-5 21:58
我一个朋友在传智上过基础班,我看的视频就是他们上课的时候录得,那上面有这个。目前也只知道这个从键盘 ...

好的。谢谢你
作者: 马嘉    时间: 2014-10-6 08:20
hollywood2014 发表于 2014-10-3 23:25
import java.util.Scanner;
public class Test_01 {

大哥你能告诉我Scanner您是从视频中学到的吗
作者: 梦里听传说    时间: 2014-10-6 19:15
package review;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/*
* 从键盘接受一个数字,打印该数字表示的时间,最大单位到天,例如:
                键盘输入6,打印6秒;
                键盘输入60,打印1分;
                键盘输入66,打印1分6秒;
                键盘输入666,打印11分6秒;
                键盘输入3601,打印1小时1秒
* */
public class Text01 {
        public static void main(String[] args) {
                BufferedReader buf=
                                new BufferedReader(new InputStreamReader(System.in));
                String str=null;
                try {
                        while((str=buf.readLine())!=null)
                        {
                                if(str.matches("\\d+"))
                                {
                                        count(str);
                                }
                                else{
                                        System.out.println("输入非法,请输入数字!谢谢");
                                        System.exit(0);
                                }
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                }
               
        }

        private static void count(String str) {
               
                if(str.length()<19)
                {
                        long x=Long.parseLong(str);
                        if(x<3600)
                                System.out.println(miao(x));
                        else if(x>=3600&&x<86400)
                        {
                                System.out.println(shi(x));
                        }
                        else if(x>=86400)
                        {
                                 System.out.println(tian(x));
                        }
                }
                else{
                        System.out.println("数过大!");
                        System.exit(0);
                }
               
        }
       
       
       
        public static String miao(long x){
                if(x<60)
                        return x+"秒!";
                else if(x>=60&&x<3600)
                {
                        if(x%60==0)
                                return x/60+"分!";
                        else
                        {
                                int y=(int)x/60;
                                return y+"分"+(x-y*60)+"秒!";
                        }
                }
                return null;
        }
       
        public static String shi(long x )
        {
                if(x%3600==0)
                        return x/3600+"小时!";
                else if(x<3600)
                        return miao(x);
                else
                {
                        long y=(long)x/3600;
                        long k=x-y*3600;
                        return y+"小时"+miao(k);
                }
        }
       
        public static String tian(long x )
        {
                if(x%86400==0)
                        return x/86400+"天!";
                else {
                        long y=(long)x/86400;
                        long k=x-y*86400;
                        return y+"天"+shi(k);
                }
        }
       
       
}

作者: 梦里听传说    时间: 2014-10-6 19:17
没优化 ,楼主可以再优化下
作者: MR.Sun    时间: 2014-10-6 21:27
鲁行 发表于 2014-10-3 22:58
/*
3、 从键盘接受一个数字,打印该数字表示的时间,最大单位到天,例如:
                键盘输入6,打 ...

你的程序。。。。其实有点不符合题目要求。。。。。如果出现3601秒的时候  应该就会输出1小时0分1秒,这个0分时不允许出现的。你的这种想法开始我也想到过。  你可以运行的看一下。
作者: MR.Sun    时间: 2014-10-6 21:30
hollywood2014 发表于 2014-10-3 23:25
import java.util.Scanner;
public class Test_01 {

唉,你跟楼上那位兄弟一样的错误,你的程序也是不符合要求的。。。当3601秒的时候 输出的是1小时0分1秒。。这个0分是不允许出现的。。。
作者: 鲁行    时间: 2014-10-6 21:31
MR.Sun 发表于 2014-10-6 21:27
你的程序。。。。其实有点不符合题目要求。。。。。如果出现3601秒的时候  应该就会输出1小时0分1秒,这 ...

你可以加几个判断就行了,只要有0的就不输出,就可以了
作者: MR.Sun    时间: 2014-10-6 21:32
李天富 发表于 2014-10-4 11:52

这位兄弟,貌似回复代码的几个人中  就你的符合要求。。。厉害!
作者: 鲁行    时间: 2014-10-6 21:34
MR.Sun 发表于 2014-10-6 21:27
你的程序。。。。其实有点不符合题目要求。。。。。如果出现3601秒的时候  应该就会输出1小时0分1秒,这 ...

你可以加几个判断就行了,只要有0的就不输出,就可以了如:
if(d!=0)
System.out.print(d+"t天");
if(h!=0)
System.out.print(h+"小时");
if(min!=0)
System.out.print(min+"分");
if(s!=0)
System.out.print(s+"秒");
这样就可以了,这个过程可以优化.
作者: MR.Sun    时间: 2014-10-6 21:40
鲁行 发表于 2014-10-6 21:34
你可以加几个判断就行了,只要有0的就不输出,就可以了如:
if(d!=0)
System.out.print(d+"t天");

我看了下8楼那位兄弟写的,还不错。不过还是谢谢你了。:lol
作者: hollywood2014    时间: 2014-10-6 22:06
马嘉 发表于 2014-10-6 08:20
大哥你能告诉我Scanner您是从视频中学到的吗

这个.....我还有其他学习资料,不过这不是重点吧,仅仅就是获取键盘输入
作者: hollywood2014    时间: 2014-10-6 22:07
MR.Sun 发表于 2014-10-6 21:30
唉,你跟楼上那位兄弟一样的错误,你的程序也是不符合要求的。。。当3601秒的时候 输出的是1小时0分1秒。 ...

我的输出没有0分吧,我刚刚试了
作者: 踏云    时间: 2014-10-6 22:15
好吧,我抄了8楼和一楼的代码,综合了一个比较清晰的代码,相对的简洁一些
import java.util.*;

class  Demo4
{
        public static void main(String[] args)
        {
                Scanner scanner=new Scanner(System.in);
                int getNum=scanner.nextInt();
                System.out.println(printTime(getNum));
        }

        public static String printTime(int time){
                char[] chinese={'天','时','分','秒'};
                int[] timeNum=new int[4];

                //获得天时分秒的数据
                timeNum[0]=time/(60*60*24);
                timeNum[1]=time%(60*60*24)/(60*60);
                timeNum[2]=time%(60*60*24)%(60*60)/60;
                timeNum[3]=time%(60*60*24)%(60*60)%60;

                String printStr="";
                for(int i=0;i<4;i++){
                        if(timeNum[i]!=0){
                                printStr=printStr+timeNum[i]+chinese[i];
                        }
                }
                return printStr;
        }
}


作者: 踏云    时间: 2014-10-6 22:17
李天富 发表于 2014-10-4 11:52

大神,那个代码块的样式是怎么贴上去的,是论坛里直接有的设置还是怎样?
作者: MR.Sun    时间: 2014-10-7 18:55
hollywood2014 发表于 2014-10-6 22:07
我的输出没有0分吧,我刚刚试了

不好意思啊,可能我编译的时候编译错了 文件。。。。是的 你的是符合要求的。。。。没有出现零分的情况,相比起来 你们的代码都比我的要简单,8#那位的最精简。你们都太猛了。。。让我感到压力山大啊。。。
作者: 郭.威    时间: 2014-10-7 22:11
。。。。。。。。。。。。。




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