入门 · 布尔逻辑
闰年判断
读一个年份,判断是否闰年。规则听着简单 — "能被 4 整除" — 然后世纪数来了。这是练习 &&、|| 和仔细读题的完美题目。
一句话答案年份能被 4 整除但不能被 100 整除,或者能被 400 整除时输出 "leap year" —— 1900 不是闰年、2000 是,两个都在隐藏用例里。
题目
输入: 一个整数 year(1 ≤ year ≤ 3000)。
输出: leap year 或 not a leap year(一字不差)。
规则:能被 4 整除且不能被 100 整除,或能被 400 整除,即为闰年。
样例:
| 输入 | 输出 | 原因 |
|---|---|---|
2024 | leap year | 被 4 整除,不被 100 整除 |
1900 | not a leap year | 被 100 整除但不被 400 整除 |
2000 | leap year | 被 400 整除 |
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 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;
}