题目描述
小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 19701970 年 11 月 11 日 00:00:0000:00:00 到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
输入描述
输入一行包含一个整数,表示时间。
输出描述
输出时分秒表示的当前时间,格式形如 HH:MM:SS
,其中 HH
表示时,值为 00 到 2323,MM
表示分,值为 00 到 5959,SS
表示秒,值为 00 到 5959。时、分、秒 不足两位时补前导 00。
样例">输入输出样例
示例一:
输入:
46800999
输出:
13:00:00
示例二:
输入:
1618708103123
输出:
01:08:23
评测用例规模与约定
对于所有评测用例,给定的时间为不超过 10^{18}1018 的正整数。
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
解题思路:
近期在备赛蓝桥杯,故记录此题。该题其实质是求解系统的一个输入数据作为时间毫秒单位时,该数是从1970年1月1日的00:00到何时,这里只需要输出时:分:秒。此题没有捷径可以走,就是考考生的分类讨论能力。该题较为简单理解,这里只讲一下大概的思路即可。
在该题目中,首先你要确定具体时间是哪一年,然后再确定是哪一月份,以此类推,再确定是哪一天,哪个小时哪个分钟哪个秒数,剩下的不够一秒的毫秒数可以丢弃不理(该题目的意思是这样)。该算法的Java代码实现如下:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long timeNum = scan.nextLong();//输入表示时间
long averageYearMs = 31536000000l, leapYearMs = 31622400000l, dayMs = 86400000, hourMs = 3600000, minuteMs = 60000, secondMs = 1000;//平年、闰年一年毫秒数3
int year, month, day, hour, minute, second;
for (year = 1970; ; year++) {//求最大年份数
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {//闰年
if (timeNum >= leapYearMs) {
timeNum -= leapYearMs;
continue;
}else {
break;//当前i便是最大年份
}
}else {//平年
if (timeNum >= averageYearMs) {
timeNum -= averageYearMs;
continue;
}else {
break;//当前i便是最大年份
}
}
}
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {//闰年,366天
for (month = 1; month <= 12; month++) {//求最大月份数
if (month == 1) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 2) {
if (timeNum >= 2505600000l) {
timeNum -= 2505600000l;
continue;
}else {
break;
}
}
if (month == 3) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 4) {
if (timeNum >= 2592000000l) {
timeNum -= 2592000000l;
continue;
}else {
break;
}
}
if (month == 5) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 6) {
if (timeNum >= 2592000000l) {
timeNum -= 2592000000l;
continue;
}else {
break;
}
}
if (month == 7) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 8) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 9) {
if (timeNum >= 2592000000l) {
timeNum -= 2592000000l;
continue;
}else {
break;
}
}
if (month == 10) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 11) {
if (timeNum >= 2592000000l) {
timeNum -= 2592000000l;
continue;
}else {
break;
}
}
if (month == 12) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
}
//month为最大月份数
if (month == 1) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 2) {
for (day = 1; day <= 29; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 3) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 4) {
for (day = 1; day <= 30; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 5) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 6) {
for (day = 1; day <= 30; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 7) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 8) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 9) {
for (day = 1; day <= 30; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 10) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 11) {
for (day = 1; day <= 30; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}
//当前号数为day
for (hour = 0; hour <= 23; hour++) {//求出当前小时数
if (timeNum >= hourMs) {
timeNum -= hourMs;
continue;
}else {
break;
}
}
//hour为当前小时
for (minute = 0; minute <= 59; minute++) {//求出当前分钟数
if (timeNum >= minuteMs) {
timeNum -= minuteMs;
continue;
}else {
break;
}
}
for (second = 0; second <= 59; second++) {//求出当前秒数
if (timeNum >= secondMs) {
timeNum -= secondMs;
continue;
}else {
break;
}
}
//显示
String hours = String.valueOf(hour);
String minutes = String.valueOf(minute);
String seconds = String.valueOf(second);
if (hours.length() == 1) {
hours = "0" + hours;
}
if (minutes.length() == 1) {
minutes = "0" + minutes;
}
if (seconds.length() == 1) {
seconds = "0" + seconds;
}
System.out.println(hours + ":" + minutes + ":" + seconds);
}else {//平年,365天
for (month = 1; month <= 12; month++) {//求最大月份数
if (month == 1) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 2) {
if (timeNum >= 2419200000l) {
timeNum -= 2505600000l;
continue;
}else {
break;
}
}
if (month == 3) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 4) {
if (timeNum >= 2592000000l) {
timeNum -= 2592000000l;
continue;
}else {
break;
}
}
if (month == 5) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 6) {
if (timeNum >= 2592000000l) {
timeNum -= 2592000000l;
continue;
}else {
break;
}
}
if (month == 7) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 8) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 9) {
if (timeNum >= 2592000000l) {
timeNum -= 2592000000l;
continue;
}else {
break;
}
}
if (month == 10) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
if (month == 11) {
if (timeNum >= 2592000000l) {
timeNum -= 2592000000l;
continue;
}else {
break;
}
}
if (month == 12) {
if (timeNum >= 2678400000l) {
timeNum -= 2678400000l;
continue;
}else {
break;
}
}
}
//month为最大月份数
if (month == 1) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 2) {
for (day = 1; day <= 28; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 3) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 4) {
for (day = 1; day <= 30; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 5) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 6) {
for (day = 1; day <= 30; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 7) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 8) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 9) {
for (day = 1; day <= 30; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 10) {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else if (month == 11) {
for (day = 1; day <= 30; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}else {
for (day = 1; day <= 31; day++) {//获取 当前 号数
if (timeNum >= dayMs) {
timeNum -= dayMs;
continue;
}else {
break;
}
}
}
//当前号数为day
for (hour = 0; hour <= 23; hour++) {//求出当前小时数
if (timeNum >= hourMs) {
timeNum -= hourMs;
continue;
}else {
break;
}
}
//hour为当前小时
for (minute = 0; minute <= 59; minute++) {//求出当前分钟数
if (timeNum >= minuteMs) {
timeNum -= minuteMs;
continue;
}else {
break;
}
}
for (second = 0; second <= 59; second++) {//求出当前秒数
if (timeNum >= secondMs) {
timeNum -= secondMs;
continue;
}else {
break;
}
}
//显示
String hours = String.valueOf(hour);
String minutes = String.valueOf(minute);
String seconds = String.valueOf(second);
if (hours.length() == 1) {
hours = "0" + hours;
}
if (minutes.length() == 1) {
minutes = "0" + minutes;
}
if (seconds.length() == 1) {
seconds = "0" + seconds;
}
System.out.println(hours + ":" + minutes + ":" + seconds);
}
scan.close();
}
}
代码确实冗余了些,可以进一步进行简化,这一步是非必要步骤,不简化也可以在训练中提交测试通过,故读者有兴趣的可以自行简化即可。