一、题目描述
小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从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的。
好了,现在让我们来看看运行结果:
好了,你以为到这里就结束了吗,其实并没有,当我发现输入的数值过大时,就会产生问题了,例如:
第一个输入很明显,个位数是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;
}
}
好了,看一下运行结果:
ok ,没发现出有问题了,果然大数类型yyds,今晚在整理出关于大数类型的一些常用方法和配套使用的一些常量。