C++ / ACM 自学笔记 · v5.0

(五) 从文字规则整理优先级

如果题面给出一般规则和例外,先找出例外覆盖的范围,而不是把所有条件直接用“或”连接。

1. 完整示例:闰年判断

题目原文(自拟): 输入 1 <= year <= 9999 的年份。按公历规则判断是否为闰年:能被 4 整除通常是闰年;能被 100 整除的年份只有同时能被 400 整除才是闰年。闰年输出 YES,否则输出 NO。

分析推导: 先拆成两种互相兼容的合法情况:能被 400 整除,或者能被 4 整除且不能被 100 整除。

#include <iostream>
using namespace std;

int main() {
    int year;
    cin >> year;
    // 整百年份由 400 的条件决定,普通年份检查 4 的条件。
    bool leap = year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
    cout << (leap ? "YES" : "NO") << '\n';
}

样例与解释: 2000 输出 YES,1900 输出 NO,2024 输出 YES。1900 是只检查 % 4 == 0 时会答错的反例。时间、额外空间均为 \(O(1)\)。

练习: 洛谷 P5711 — 闰年判断、洛谷 P5710 — 数的性质。

查阅笔记正文与全部题解 · Ctrl / ⌘ K