1 条题解

  • 0
    @ 2026-10-8 21:09:26

    月份天数

    一个自然的想法,和它的整理

    输入年、月,输出这个月有多少天。第一反应可能是给 12 个月各写一个 if——能做,但 12 个分支太啰嗦。稍微整理一下就会发现,12 个月其实只有三类:

    • 31 天:1、3、5、7、8、10、12 月
    • 30 天:4、6、9、11 月
    • 2 月:平年 28 天,闰年 29 天

    突破口:分类讨论 + 复用已有结论

    第三类是本题真正的考点。2 月的天数取决于闰年,而闰年的判断规则正是上一题的内容——四年一闰,百年不闰,四百年再闰:

    (y % 4 == 0 && y % 100 != 0) || y % 400 == 0
    

    于是整个程序就是"三段分类 + 一次闰年判断"的组合,没有任何新知识,考的是把已有规则组织起来的能力。

    代码实现

    #include <stdio.h>
    
    int main() {
        int y, m;
        scanf("%d%d", &y, &m);
        if (m == 4 || m == 6 || m == 9 || m == 11)
            printf("30");
        else if (m == 2) {
            if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
                printf("29");
            else
                printf("28");
        } else
            printf("31");
        return 0;
    }
    

    用样例验证:1926 年 8 月,8 不在 30 天列表、不是 2 月 → 31 ✓;2000 年 2 月,2000 能被 400 整除是闰年 → 29 ✓。

    容易出错的细节

    1. 31 天的月份列表容易抄错:7、8 两个月连续是大月,1 月也要在列表里。可以按口诀"一三五七八十腊"记(腊 = 12 月)。
    2. 闰年规则必须完整:只判断 y % 4 == 0 的话,1900 2 这组数据就会输出 29 而不是 28。
    3. 判断顺序上先排除 30 天和 2 月,剩下的自然全是 31 天——比逐月枚举少写很多分支。

    复杂度

    时间与空间复杂度均为 O(1)。

    这题的本质:分类讨论 + 复用已有结论。闰年判断不是新知识,而是上一题的结论直接搬过来用——做题时学会识别"这步我已经会了",是提速的关键。

    信息

    ID
    518
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    3
    已通过
    3
    上传者