世纪闰年指能被100整除的年份,必须被400整除才是闰年;普通闰年只需被4整除且不被100整除。判断世纪闰年须先验证是否为世纪年份(%100==0),再检查%400==0。

什么是世纪闰年,和普通闰年有什么区别 世纪闰年特指能被100整除的年份(如1900、2000、2100),它是否为闰年不看“能否被4整除”,而要看“能否被400整除”。这是格里高利历的修正规则:普通闰年(如2024)只需被4整除且不被100整除;但世纪年份必须被400整除才算闰年。
所以判断逻辑不是“年份 % 4 == 0”就能覆盖——直接套用普通闰年条件会把1900、2100错判为闰年。
用 if 写出无歧义的世纪闰年判断逻辑
核心是把“是否为世纪年份”作为前置分支,避免逻辑短路或优先级误判:
推荐写法(清晰、不易错):
bool isCenturyLeapYear(int year) {
if (year % 100 != 0) {
return false; // 不是世纪年份,直接排除
}
return year % 400 == 0;
}
等价但更紧凑的写法(需注意运算符优先级):
bool isCenturyLeapYear(int year) {
return (year % 100 == 0) && (year % 400 == 0);
}
常见错误写法(❌):
return year % 400 == 0 || year % 4 == 0; // 错!把2024也当成了世纪闰年
- 这个表达式实际在判断“普通闰年或世纪闰年”,不是纯世纪闰年
-
isCenturyLeapYear(2024)会返回true,但2024根本不是世纪年份
测试几个关键年份验证逻辑是否正确
手动验证比依赖直觉更可靠。重点关注边界值:
-
isCenturyLeapYear(1900)→false(1900 ÷ 400 = 4.75,不整除) -
isCenturyLeapYear(2000)→true(2000 ÷ 400 = 5,整除) -
isCenturyLeapYear(2100)→false -
isCenturyLeapYear(2024)→false(非世纪年份,必须为false)
如果测试中出现 true 对应 1900 或 2100,说明逻辑漏掉了 % 100 == 0 这一前提。
为什么不用 std::chrono 或第三方库
std::chrono 提供的是时间点、持续期操作,不暴露闰年规则判断接口;C++20 的 <chrono></chrono> 也没有 is_leap_year_for_century 这类函数。标准库有意将日历规则留给用户按需实现——因为“世纪闰年”本身是个特定语义需求,不是通用时间计算的原子操作。
如果你实际要判断的是“某年是否为闰年”(不限定世纪),那就该用完整闰年公式:(year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);但题目明确限定“世纪闰年”,就必须先筛出世纪年份再验400。
最容易被忽略的一点:函数名和逻辑必须严格对应语义。“世纪闰年”不是“闰年”的子集别名,而是交集里的一个真子集——少一个 % 100 == 0 条件,结果就完全跑偏。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











