1 条题解
-
0
闰年判断
一个自然的想法,和它的漏洞
看到题目,最直觉的写法是:能被 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,可以直接作为输出。这个技巧在后面的判断素数、判断回文中会反复出现。
容易出错的细节
- 整百年是最常见的失分点。处理时记住一句话:能被 100 整除的年份,必须同时被 400 整除才是闰年。
- 输出内容是
1/0,不是 yes/no 或 true/false,审题时注意。 - 数据范围 1582 ≤ n ≤ 2020,
int足够。虽然本题不会触发溢出,但按数据范围选择变量类型应当成为习惯。
复杂度
时间与空间复杂度均为 O(1):无循环,输入、判断、输出各执行一次。
信息
- ID
- 512
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 28
- 已通过
- 4
- 上传者