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

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

一、题目描述
小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从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,今晚在整理出关于大数类型的一些常用方法和配套使用的一些常量。

相关文章
|
11天前
|
数据采集 人工智能 安全
|
7天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
336 164
|
6天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
341 155
|
7天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
507 4
|
14天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
971 7