【GESP】C++二级真题 luogu-B4260 [GESP202503 二级] 时间跨越
GESP二级真题,分支语句练习,难度★✮☆☆☆。
luogu-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 \leq y \leq 3000$,$1 \leq m \leq 12$,$1 \leq d \leq 31$,$0 \leq h \leq 23$,$1 \leq k \leq 24$。数据保证为合法时间。
闰年判断规则
- 普通闰年:年份能被 $4$ 整除,但不能被 $100$ 整除。
- 世纪闰年:年份能被 $400$ 整除。
满足以上任意一条规则的年份就是闰年,否则是平年。
题目分析
解题思路
- 观察题目特点
- 输入年月日时和时间跨度k小时
- 需要计算k小时后的具体时间
- 需要考虑时间进位问题
- 需要处理闰年判断
- 分析时间规律
- 小时进位:超过24小时进1天
- 日期进位:根据不同月份天数判断
- 月份进位:超过12月进1年
- 闰年处理:影响2月天数判断
- 实现方案
- 先处理小时进位
- 然后处理日期进位(需考虑大小月和闰年)
- 最后处理月份进位
- 输出最终结果
- 代码实现要点
- 处理小时进位:h += k
- 判断闰年:能被400整除或能被4整除但不能被100整除
- 处理月份天数:大月31天,小月30天,2月特殊处理
- 按格式输出结果
- 复杂度分析
- 时间复杂度:O(1)
- 空间复杂度:O(1)
- 注意事项
- 输入数据保证合法
- 年份范围:2000≤y≤3000
- 月份范围:1≤m≤12
- 日期范围:1≤d≤31
- 小时范围:0≤h≤23
- 时间跨度:1≤k≤24
示例代码
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
37
38
39
40
41
42
43
#include <iostream>
using namespace std;
int main() {
// 声明年、月、日、时、时间跨度变量
int y, m, d, h, k;
// 输入年月日时和时间跨度
cin >> y >> m >> d >> h >> k;
// 计算小时
h += k;
// 如果小时超过24,进位到天
if (h >= 24) {
h -= 24;
d++;
}
// 处理日期进位
if (d == 32) {
// 大月进位
d = 1;
m++;
} else if (d == 31 && (m == 4 || m == 6 || m == 9 || m == 11)) {
// 小月进位(4,6,9,11月)
d = 1;
m++;
} else if (d == 30 && m == 2) {
// 2月进位(30天)
d = 1;
m++;
} else if (d == 29 && m == 2 &&
!(y % 400 == 0 || y % 4 == 0 && y % 100 != 0)) {
// 2月进位(29天,非闰年)
d = 1;
m++;
}
// 处理月份进位到年
if (m == 13) {
m = 1;
y++;
}
// 输出结果
cout << y << " " << m << " " << d << " " << h << endl;
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权