文章

【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$ 整除。

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


题目分析

解题思路

  1. 观察题目特点
    • 输入年月日时和时间跨度k小时
    • 需要计算k小时后的具体时间
    • 需要考虑时间进位问题
    • 需要处理闰年判断
  2. 分析时间规律
    • 小时进位:超过24小时进1天
    • 日期进位:根据不同月份天数判断
    • 月份进位:超过12月进1年
    • 闰年处理:影响2月天数判断
  3. 实现方案
    • 先处理小时进位
    • 然后处理日期进位(需考虑大小月和闰年)
    • 最后处理月份进位
    • 输出最终结果
  4. 代码实现要点
    • 处理小时进位:h += k
    • 判断闰年:能被400整除或能被4整除但不能被100整除
    • 处理月份天数:大月31天,小月30天,2月特殊处理
    • 按格式输出结果
  5. 复杂度分析
    • 时间复杂度:O(1)
    • 空间复杂度:O(1)
  6. 注意事项
    • 输入数据保证合法
    • 年份范围: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 进行授权