簡記:四年一閏,百年不閏,四百年再閏。
#include <stdbool.h>
bool is_leap_year(int year) {
if (year % 4 != 0) return false; // 不能被 4 整除:平年
if (year % 100 != 0) return true; // 能被 4、不能被 100:閏年
if (year % 400 != 0) return false; // 能被 100、不能被 400:平年
return true; // 能被 400:閏年
}
// 等價單行表達式
bool is_leap(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
| 錯誤寫法 | 反例年份 | 錯誤結果 | 原因 |
|---|---|---|---|
if (year%4==0) leap=1; | 1900 | 誤判為閏年 | 漏掉百年不閏規則 |
if (year%400==0) leap=1; else if (year%100==0) leap=0; else if (year%4==0) leap=1; | 無 | 正確但順序易混淆 | 邏輯正確,可讀性稍差 |
leap = (year%4==0) ? 1 : 0; | 1900, 2000 | 1900 錯、2000 對 | 同第一種 |
for (int y = 1900; y <= 2100; y++)
if (is_leap_year(y))
printf("%d ", y);
// 輸出: 1904 1908 ... 1996 2000 2004 ... 2096
// 注意:1900 不在列表,2000 在列表
需結合「每月天數表」+「閏年判斷」調整 2 月天數,建議使用標準庫 <time.h> 的 mktime/difftime 避免手寫錯誤。