1 条题解

  • 0
    @ 2026-10-8 20:52:18

    闰年判断

    一个自然的想法,和它的漏洞

    看到题目,最直觉的写法是:能被 4 整除的就是闰年。

    if (n % 4 == 0) 输出 1; else 输出 0;
    

    拿样例验证:1926 输出 0,1996 输出 1,都对。但 1900 这组数据会出错——它能被 4 整除,正确答案却是 0。样例里同时放 1900 和 2000,就是在专门检验这一点。

    为什么 1900 不是闰年

    地球公转一圈约 365.2422 天。"每 4 年补 1 天"相当于按 365.25 天计算,长期累积会比真实时间偏多。因此现行公历(格里高利历)在"每 4 年一闰"的基础上增加修正:

    • 能被 4 整除,且不能被 100 整除 → 闰年
    • 能被 400 整除 → 闰年
    • 其余为平年

    也就是 四年一闰,百年不闰,四百年再闰

    按这个规则回看样例:1900 能被 100 整除、不能被 400 整除,是平年;2000 能被 400 整除,是闰年。与期望输出完全一致。

    代码实现

    把规则逐条翻译成逻辑表达式即可:

    #include <stdio.h>
    
    int main() {
        int n;
        scanf("%d", &n);
        if ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
            printf("1");
        else
            printf("0");
        return 0;
    }
    

    两点说明:

    • && 优先级高于 ||,内层括号省略后结果不变,但保留括号能让"同属一个条件"的结构更清晰。
    • 也可以更紧凑:printf("%d", (n % 4 == 0 && n % 100 != 0) || n % 400 == 0);——逻辑表达式的值本身就是 1 或 0,可以直接作为输出。这个技巧在后面的判断素数、判断回文中会反复出现。

    容易出错的细节

    1. 整百年是最常见的失分点。处理时记住一句话:能被 100 整除的年份,必须同时被 400 整除才是闰年。
    2. 输出内容是 1 / 0,不是 yes/no 或 true/false,审题时注意。
    3. 数据范围 1582 ≤ n ≤ 2020,int 足够。虽然本题不会触发溢出,但按数据范围选择变量类型应当成为习惯。

    复杂度

    时间与空间复杂度均为 O(1):无循环,输入、判断、输出各执行一次。

    信息

    ID
    512
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    28
    已通过
    4
    上传者