1 条题解

  • 0
    @ 2025-8-24 21:18:12

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 21:18:11,当前版本为作者最后更新于2025-05-09 21:22:29,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    欢迎报名洛谷网校,期待和大家一起进步!

    本题考察分支嵌套。

    这是一道细节繁多的试题,我在上传该试题的时候也构造了不少极端情况,相信大家一定在细节上耗费了比较多的时间。我们来分析这一个试题。

    实际上这一个题的思路是简单明了的,我们只要一步一步地把时间往前推即可。具体而言:

    1. 先动时针。我们先把要经过的 kk 个小时加到当前的小时上。这一部分的参考代码:
    2. 如果加上 kk 之后,小时数超过了 2323(比如变成了 2424 点、2525 点),那就说明已经进入第二天了。这时候,我们要把小时数减掉 2424,然后把日期加一天。
    3. 当日期加了一天后,我们得看看这个月是不是也过完了。如果日期超过了这个月应有的天数,那就说明这个月过完了,进入了下一个月。我们要把日期减掉这个月的天数(比如 3232 日变成 11 日),然后把月份加一。第二、第三部分的关键代码是:
      if (d > days) {
          // days 表示这个月应有的天数
          d -= days;
          m += 1;
      }
      
    4. (容易被忽略!) 一年只有 1212 个月。如果月份加了一之后超过了 1212,那就说明这一年也过完了,进入了下一年。我们要把月份变回 11 月,然后把年份加一。参考代码:
      if (m > 12) {
          m = 1;
          y += 1;
      }
      

    代码中的关键是判断当前月份 mm 一共有多少天。我们使用变量 days 存储该月有多少天。我们首先先判断 1,3,5,7,8,10,121,3,5,7,8,10,12 这些大月,再判断 4,6,9,114,6,9,11 这些小月——因为它们都方便处理。最后留下来的就是 22 月了。根据题意,闰年的判断标准是:(年份能被 44 整除 并且 年份不能被 100100 整除) 或者(年份能被 400400 整除),因此使用 if 语句将其表述出来即可。这部分的参考代码:

    if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
        // 这些是大月,有 31 天
        days = 31;
    } else if (m == 4 || m == 6 || m == 9 || m == 11) {
        // 这些是小月,有 30 天
        days = 30;
    } else if (m == 2) { // 如果是 2 月,就要判断是不是闰年了
        if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
            days = 29; // 闰年的 2 月有29天
        } else {
            days = 28; // 平年的 2 月有28天
        }
    }
    

    这样,只需要使用 if (d > days) 即可判断是否进入了下一个月,大幅减少了代码编写难度和复杂程度。

    • 1

    信息

    ID
    11770
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者