入门 · 布尔逻辑

闰年判断

读一个年份,判断是否闰年。规则听着简单 — "能被 4 整除" — 然后世纪数来了。这是练习 &&、|| 和仔细读题的完美题目。

一句话答案年份能被 4 整除但不能被 100 整除,或者能被 400 整除时输出 "leap year" —— 1900 不是闰年、2000 是,两个都在隐藏用例里。

题目

输入: 一个整数 year(1 ≤ year ≤ 3000)。

输出: leap year 或 not a leap year(一字不差)。

规则:能被 4 整除且不能被 100 整除,或能被 400 整除,即为闰年。

样例:

输入输出原因
2024leap year被 4 整除,不被 100 整除
1900not a leap year被 100 整除但不被 400 整除
2000leap year被 400 整除

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。

卡住了?提示

提示 1 — 把句子直接翻译成代码

"被 4 整除且不被 100 整除,或被 400 整除" 写成 (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)。括号很重要:&& 优先级高于 ||,但显式括号让意图可读。

提示 2 — 抓偷懒解法的测试

只写"被 4 整除"的解法能过 2024,但会栽在 1900(应为否)和 2000(应为是)上 — 判题里正好有这几个陷阱年份。这就是边界测试的意义。

题解(先自己试试!)
#include <iostream>
using namespace std;

int main() {
    int y;
    cin >> y;
    bool leap = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
    if (leap) cout << "leap year" << endl;
    else cout << "not a leap year" << endl;
    return 0;
}

注意 cout 会把 bool 打成 1/0 — 所以我们要分支输出而不是直接打印它。条件与布尔无处不在;三个数的最大值从另一个角度练同一块肌肉。

深度解析

为什么这样做对

规则本身是一串例外:能被 4 整除,但世纪年除外,但 400 的倍数又是。这题考的是照着规格逐条实现,而不是写「听起来对」的版本。

代价

O(1),最多三次取模。

常见错法

  • 只写 year % 4 == 0 会说 1900 是闰年。它不是:1900 % 100 == 0 且 1900 % 400 != 0。
  • a || b && c 会被解析成 a || (b && c)——&& 优先级更高。少写括号是这题的经典错法。

下一步

更多要把边界抠准的题:三个数的最大值。

记住这两句

  • 1900 不是闰年,2000 是。
  • && 比 || 优先——不写括号就等着被咬。
🐞 这段是错的 —— 点开,亲手让它挂一次

只判了 % 4,1900 混过去了

#include <iostream>
using namespace std;

int main() {
    int y;
    cin >> y;
    if (y % 4 == 0) cout << "leap year" << endl;
    else cout << "not a leap year" << endl;
    return 0;
}