B4260 [GESP202503 二级] 时间跨越

题目描述

假设现在是 y 年 m 月 d 日 h 时而 k 小时后是 y’ 年 m’ 月 d’ 日 h’ 时,对于给定的 y, m, d, h, k,小杨想请你帮他计算出对应的 y’, m’, d’, h’ 是多少。

输入格式

输入包含五行,每行一个正整数,分别代表 y, m, d, h, k。

输出格式

输出四个正整数,代表 y’, m’, d’, h’。

输入输出样例 #1

输入 #1

1
2
3
4
5
2008
2
28
23
1

输出 #1

1
2008 2 29 0

说明/提示

对于全部数据,保证有 2000 ≤ y ≤ 3000,1 ≤ m ≤ 12,1 ≤ d ≤ 31,0 ≤ h ≤ 23,1 ≤ k ≤ 24。数据保证为合法时间。

闰年判断规则

  • 普通闰年:年份能被 4 整除,但不能被 100 整除。
  • 世纪闰年:年份能被 400 整除。

满足以上任意一条规则的年份就是闰年,否则是平年。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
using namespace std;
int main () {
int y, m, d, h, k;
cin >> y >> m >> d >> h >> k;
h += k;
if (h >= 24) {
h -= 24;
d += 1;
int days = 0;
if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
days = 31;
}
else if (m == 4 || m == 6 || m == 9 || m == 11) {
days = 30;
}
else if (m == 2) {
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
days = 29;
}
else {
days = 28;
}
}
if (d > days) {
d -= days;
m += 1;
if (m > 12) {
m = 1;
y += 1;
}
}
}
cout << y << " " << m << " " << d << " " << h << endl;
return 0;
}