#define SECONDS_PER_YEAR (60*60*24*365UL)
看似正確,實則忽略了閏年與天文年差異。面試官往往追問:「每年秒數都一樣嗎?」
| 年份類型 | 定義 | 秒數(約) |
|---|---|---|
| 回歸年 | 兩次春分點間隔 | 365天5時48分46秒 = 31,556,926 秒 |
| 恆星年 | 地球繞太陽360° | 365天6時9分10秒 = 31,558,150 秒 |
| 儒略年 | 平均 365.25 天 | 31,557,600 秒 |
| 公曆年 | 400年97個閏年 | 平均 365.2425 天 = 31,556,952 秒 |
#define SECONDS_PER_TROPICAL_YEAR \
(365*24*60*60 + 5*60*60 + 48*60 + 46) // 31556926
/* 更精確:365天5時48分45.975456秒 → 需用浮點數 */
#define SECONDS_PER_TROPICAL_YEAR_PRECISE 31556925.975456
#define SECONDS_PER_SIDEREAL_YEAR \
(365*24*60*60 + 6*60*60 + 9*60 + 10) // 31558150
#define SECONDS_PER_GREGORIAN_YEAR_AVG \
(365*24*60*60 + 97*24*60*60/400) // 平均值
/* 或簡單版:按 365 天計算,註明為「平年」 */
#define SECONDS_PER_COMMON_YEAR (60*60*24*365UL) // 31536000
UL 後綴防止 16 位系統溢出double,32 位 float 足夠bool is_leap(int year) {
return (year%4==0 && year%100!=0) || (year%400==0);
}
這道題考察的不僅是宏寫法,更是工程思維:明確需求語境、選擇合適精度、文檔化假設。回答時先給出通用工程版,再展開科學細節,展現深度。