使用大数类型的例子(时间显示)

一、题目描述

小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从1970年1月1日00:00:00到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

二、输入描述

输入一行包含一个整数,表示时间。

三、输出描述

输出时分秒表示的当前时间,格式形如HH;MM;SS,其中HH表示时,值为0到23,MM表示分,值为0到59,ss表示秒,值为0到59。时、分、秒不足两位时补前导0

四、解题思路

首先,分两种情况处理,第一种是输入的整数大于一天的总秒数,第二种是输入的整数小于一天的总秒数,如果大于的话,直接取余就可以得到当天从00.00.00开始的总秒数了,接下来接受需要对这个余数作时间处理了,把余数再除以3600(一个小时)得到的结果就是当天的小时数,余数即为剩下的分钟数和秒数了,然后再把得到的余数除以60得到的结果就是分钟数,余数就是秒数了。最后作前导0处理即可啦。

五、第一种算法?

import java.util.Scanner;

public class day03 {
    public static void main(String[] args) {
        //一天的总秒数
        double day_second = 24*60*60;
        Scanner scanner = new Scanner(System.in);
        //输入一个整数
        while(scanner.hasNextDouble()) {
            double seconds = scanner.nextDouble();
            //如果输入的整数大于一天的总秒数
            if (seconds > day_second) {
                double yuShu = seconds % day_second;
                System.out.println(count(yuShu));
            }
            //如果输入的整数小于一天的总秒数
            else {
                System.out.println(count(seconds));
            }
        }
    }
    public static String count(double arg){
        String str_h = String.format("%.8f",arg/3600);
        int k1 = str_h.indexOf(".");
        String str_h_1 = str_h.substring(0,k1);
        double j_minutes = arg - Double.parseDouble(str_h_1)*3600;
        String str_m = String.format("%.8f",j_minutes/60);
        int k2 = str_m.indexOf(".");
        String str_m_1 = str_m.substring(0,k2);
        int second = (int) (j_minutes - Double.parseDouble(str_m_1)*60);
        if(str_h_1.equals("24")){
            str_h_1 = "00";
        }
        String str_s_1 = getString1(String.valueOf(second));
        str_h_1 = getString1(str_h_1);
        str_m_1 = getString1(str_m_1);
        return str_h_1+":"+str_m_1+":"+str_s_1;
    }

    private static String getString1(String str_m_1) {
        if(str_m_1.length()==1){
            str_m_1 += "0";
            StringBuilder buffer = new StringBuilder(str_m_1);
            StringBuilder buffer1 = buffer.reverse();
            str_m_1 = buffer1.toString();
        }
        return str_m_1;
    }
}

count方法是得出最后结果的,getString1方法是给时分秒加上前导0的。

好了,现在让我们来看看运行结果:

使用大数类型的例子(时间显示)_第1张图片

 好了,你以为到这里就结束了吗,其实并没有,当我发现输入的数值过大时,就会产生问题了,例如:

使用大数类型的例子(时间显示)_第2张图片

第一个输入很明显,个位数是9,然后得到的秒数的个位数应该也是9,但是结果却并没有,而且比他大一的数得出的时间还是和他的结果一样。So 为什么呢,其实这原因是因为定义的数据类型是double,双精度浮点数,当数值过大时,在计算机存储中一样会产生精度丢失,所以不能这样做。

于是我又想到了用java中有的超级方便的大数类型,刷题必备的。

就有了第二种算法

package day03;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class completeDay03 {
    public static void main(String[] args) {
        //一天的总秒数
        BigDecimal day_second = new BigDecimal("86400");
        BigDecimal seconds;
        //作为标志数
        BigDecimal flag;
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNextBigDecimal()) {
            //输入一个整数
            seconds = scanner.nextBigDecimal();
            //取得输入的整数与一天的总秒数取最大值
            flag = seconds.max(day_second);
            //如果输入的整数大于一天的总秒数
            if (flag.equals(seconds)) {
                //直接取余代入即可
                BigDecimal yuShu = seconds.remainder(day_second);
                System.out.println(count(yuShu));
            }
            //如果输入的整数小于一天的总秒数
            else {
                //直接代入方法即可
                System.out.println(count(seconds));
            }
        }
    }
    public static String count(BigDecimal arg){
        //首先获得一天的小时数是多少,中间参数0是保留多少位小数,RoundingMode.DOWN的意思是向零方向舍入
        String hours = String.format("%.0f",arg.divide(new BigDecimal("3600"),0, RoundingMode.DOWN));
        //上面取得了小时数之后,还得获得剩下的秒数
        BigDecimal j_minutes = arg.subtract( new BigDecimal(hours).multiply(new BigDecimal("3600")));
        //取得分钟数
        String minutes = String.format("%.0f",j_minutes.divide(new BigDecimal("60"),0, RoundingMode.DOWN));
        //取得秒数
        String second = String.format("%.0f",j_minutes.subtract( new BigDecimal(minutes).multiply(new BigDecimal("60"))));
        //下面为了符合题目要求,作输出字符串整理
        if(hours.equals("24"))
            hours = "00";
        hours = getString1(hours);
        second = getString1(second);
        minutes = getString1(minutes);
        return hours+":"+minutes+":"+second;
    }

    private static String getString1(String str_m_1) {
        if(str_m_1.length()==1){
            str_m_1 += "0";
            StringBuilder buffer = new StringBuilder(str_m_1);
            StringBuilder buffer1 = buffer.reverse();
            str_m_1 = buffer1.toString();
        }
        return str_m_1;
    }
}

好了,看一下运行结果:

使用大数类型的例子(时间显示)_第3张图片

使用大数类型的例子(时间显示)_第4张图片

ok ,没发现出有问题了,果然大数类型yyds,今晚在整理出关于大数类型的一些常用方法和配套使用的一些常量。 

 

你可能感兴趣的:(每日算法,java,算法,开发语言)