题解
2026-02-05 23:22:46
发布于:浙江
10阅读
0回复
0点赞
题目解析
- 输入输出:输入五行五个正整数,分别表示起始时间的年份 、月份 、日期 、小时 以及经过的小时数 ;输出一行四个正整数 ,表示 小时后的时间。
- 数据范围:,,,,,且输入保证为合法时间。
- 复杂度要求:时间复杂度 ,空间复杂度 (因 ,最多跨越一天,无需循环处理)。
- 算法知识点:
日期计算、闰年判断、模拟进位
思路解析
- 小时累加:将起始小时 加上 ,由于 ,结果最大为 ,最多只会产生一天进位。
- 小时进位判定:若累加后小时数 ,则天数 加 ,小时数减去 得到最终 。
- 闰年适配:通过闰年判定函数(能被 整除但不能被 整除,或能被 整除)检查当前年份。若为闰年且当前月份为 月,则将 月天数临时设为 天,否则使用平年的 天。
- 天数进位判定:若天数 超过当前月份的最大天数,则将天数置为 ,月份 加 (进入下一月)。
- 月份进位判定:若月份超过 ,则将月份置为 ,年份 加 (进入下一年)。
- 结果输出:按顺序输出处理后的年份、月份、天数、小时。
完整代码
#include <bits/stdc++.h>
using namespace std;
// 闰年判断:能被4整除但不能被100整除,或能被400整除
bool check(int n) {
if (n % 100 != 0 and n % 4 == 0) return true;
else if (n % 400 == 0) return true;
else return false;
}
// 平年各月天数,索引0占位,1-12对应1-12月
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main() {
int year, month, day, hour, k;
cin >> year >> month >> day >> hour >> k;
// 累加小时数
hour += k;
// 处理小时进位到天数(因k≤24,最多进位1天)
if (hour > 23) {
day++;
hour -= 24;
}
// 关键:若当前是闰年的2月,调整2月天数为29天
if (month == 2 and check(year)) {
days[2]++;
}
// 处理天数进位到月份
if (day > days[month]) {
day = 1;
month++;
}
// 处理月份进位到年份
if (month > 12) {
month = 1;
year++;
}
printf("%d %d %d %d", year, month, day, hour);
return 0;
}
全部评论 2

4天前 来自 广东
0
4天前 来自 广东
0








有帮助,赞一个