题目解析
* 输入输出:输入五行五个正整数,分别表示起始时间的年份 yyy、月份 mmm、日期 ddd、小时 hhh 以及经过的小时数 kkk;输出一行四个正整数 y′,m′,d′,h′y', m', d', h'y′,m′,d′,h′,表示 kkk 小时后的时间。
* 数据范围:2000≤y≤30002000 \leq y \leq 30002000≤y≤3000,1≤m≤121 \leq m \leq 121≤m≤12,1≤d≤311 \leq d \leq 311≤d≤31,0≤h≤230 \leq h \leq 230≤h≤23,1≤k≤241 \leq k \leq 241≤k≤24,且输入保证为合法时间。
* 复杂度要求:时间复杂度 O(1)O(1)O(1),空间复杂度 O(1)O(1)O(1)(因 k≤24k \leq 24k≤24,最多跨越一天,无需循环处理)。
* 算法知识点:日期计算、闰年判断、模拟进位
思路解析
1. 小时累加:将起始小时 hhh 加上 kkk,由于 k≤24k \leq 24k≤24,结果最大为 474747,最多只会产生一天进位。
2. 小时进位判定:若累加后小时数 ≥24\geq 24≥24,则天数 ddd 加 111,小时数减去 242424 得到最终 h′h'h′。
3. 闰年适配:通过闰年判定函数(能被 444 整除但不能被 100100100 整除,或能被 400400400 整除)检查当前年份。若为闰年且当前月份为 222 月,则将 222 月天数临时设为 292929 天,否则使用平年的 282828 天。
4. 天数进位判定:若天数 ddd 超过当前月份的最大天数,则将天数置为 111,月份 mmm 加 111(进入下一月)。
5. 月份进位判定:若月份超过 121212,则将月份置为 111,年份 yyy 加 111(进入下一年)。
6. 结果输出:按顺序输出处理后的年份、月份、天数、小时。
完整代码