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

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 使用大数类型的例子(时间显示)

一、题目描述
小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从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的。

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

44e8f81478bc4afdb53d6b0fc953f1f8.png

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

7d36a096e6664ba3af0f6849dcece750.png

第一个输入很明显,个位数是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;
}

}
好了,看一下运行结果:
7e92f50476f44d8ea7c7b6d74e98ba74.png
4b6dc801152f479a842e2b67dace083a.png

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

相关文章
|
云安全 安全 网络安全
云计算与网络安全:技术融合的未来之路
【10月更文挑战第38天】 在数字化浪潮中,云计算和网络安全成为支撑现代企业和个人数据安全的两大基石。本文将深入探讨云计算服务如何与网络安全技术相结合,保障信息安全,并分析面临的挑战及未来发展趋势。我们将通过实际案例,揭示云安全的最佳实践,为读者提供一条清晰的技术融合路径。
183 1
|
6天前
|
人工智能 JSON 自然语言处理
让教学更智慧:用阿里云百炼工作流,自动生成中小学教材内容#小有可为#有温度的AI
通过可视化工作流编排,将大模型推理能力转化为标准化的教学内容生成引擎。教师只需输入教材标题和适用学段,即可自动获得结构完整、符合课程标准的章节内容,大幅降低备课门槛,助力教育资源均衡化。
467 123
|
8天前
|
人工智能 定位技术 SEO
我学 GEO 第 15 天:终于知道AI GEO该如何做?
我是暴走的莉莉酱,边旅行边研究AI GEO的数字游民。专注普通人如何提升“AI可见度”——让AI在回答用户问题时准确识别、理解并推荐你。不讲玄学,只做可测、可调、可持续的GEO实践。
448 127
|
10天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
764 5
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
2天前
|
消息中间件 存储 Kafka
Kafka 原生消息入湖能力上线!一键打通实时流与数据湖
阿里云消息队列 Kafka 版正式上线原生消息入湖能力。
221 121
|
2天前
|
人工智能 安全 Cloud Native
Higress 新发布:AI Gateway 能力增强,Gateway API 及其推理扩展持续打磨
增强 AI 网关能力,持续打磨 Gateway API 及其推理扩展。
271 122
|
8天前
|
缓存 人工智能 运维
阿里云618百炼大模型Qwen3.7-Max功能、免费试用、订阅计费、配置接入详解
Qwen3.7-MAX是阿里云百炼平台推出的通义千问3.7系列旗舰大语言模型,专为智能体时代复杂任务打造,依托阿里云全域算力与自研技术,在逻辑推理、长文本处理、代码工程、长周期自主执行等领域达到行业顶尖水平。2026年618期间,该模型推出多重免费试用权益、按量计费5折、订阅套餐优惠等专属福利,覆盖个人开发者、团队与企业全场景需求,以下从核心功能、免费试用、订阅计费、配置接入四方面展开详细解析。
454 123

热门文章

最新文章