B4260 [GESP202503 二级] 时间跨越
欢迎报名洛谷网校,报名课程可以获得对应组别的知识点讲解与答疑服务,期待和大家一起进步!点击图片即可报名。
:::align{center} :::
本题考察分支嵌套。
这是一道细节繁多的试题,我在上传该试题的时候也构造了不少极端情况,相信大家一定在细节上耗费了比较多的时间。我们来分析这一个试题。
实际上这一个题的思路是简单明了的,我们只要一步一步地把时间往前推即可。具体而言:
- 先动时针。我们先把要经过的
k 个小时加到当前的小时上。这一部分的参考代码: - 如果加上
k 之后,小时数超过了23 (比如变成了24 点、25 点),那就说明已经进入第二天了。这时候,我们要把小时数减掉24 ,然后把日期加一天。 - 当日期加了一天后,我们得看看这个月是不是也过完了。如果日期超过了这个月应有的天数,那就说明这个月过完了,进入了下一个月。我们要把日期减掉这个月的天数(比如
32 日变成1 日),然后把月份加一。第二、第三部分的关键代码是:if (d > days) { // days 表示这个月应有的天数 ________; ________; } - (容易被忽略!) 一年只有
12 个月。如果月份加了一之后超过了12 ,那就说明这一年也过完了,进入了下一年。我们要把月份变回1 月,然后把年份加一。参考代码:if (m > 12) { ________; ________; }
代码中的关键是判断当前月份 days 存储该月有多少天。我们首先先判断 if 语句将其表述出来即可。这部分的参考代码:
if (________) {
// 这些是大月,有 31 天
days = 31;
} else if (________) {
// 这些是小月,有 30 天
days = 30;
} else if (________) { // 如果是 2 月,就要判断是不是闰年了
if (________) {
days = 29; // 闰年的 2 月有29天
} else {
days = 28; // 平年的 2 月有28天
}
}
这样,只需要使用 if (d > days) 即可判断是否进入了下一个月,大幅减少了代码编写难度和复杂程度。