基姆拉爾森計算公式(Zeller's Congruence?的變體)是一種快速根據公歷日期計算星期幾的數學公式。其核心思想是通過對年月日的數值進行特定變換和取模運算,直接得到星期幾的結果。
公式定義
對于日期?年-月-日
,公式如下:
其中:
-
月份調整:若月份為 1 月或 2 月,需視為上一年的 13 月或 14 月。例如,2024 年 1 月 1 日 → 視為 2023 年 13 月 1 日。
-
變量含義:
-
h: 星期(0=星期六, 1=星期日, 2=星期一, ..., 6=星期五)
-
d: 日(1-31)
-
m: 調整后的月份(3-14,對應原1-12月)
-
y: 調整后的年份的后兩位(例如 2023 年 → 23)
-
c: 調整后的年份的前兩位(例如 2023 年 → 20)
-
公式使用步驟
以?2024 年 8 月 15 日?為例:
通過此公式,無需逐日累加即可高效計算任意日期的星期,特別適合處理大時間跨度的日期問題。
-
調整月份和年份:
-
原日期:2024 年 8 月 15 日 → 無需調整(8 ≥ 3)。
-
若為 2024 年 2 月 5 日 → 需調整為 2023 年 14 月 5 日。
-
-
拆分年份:
-
c = ?2024/100? = 20
-
y = 2024 mod??100 = 24
-
-
代入公式:
#include <iostream> using namespace std;int zeller(int year, int month, int day) {if (month < 3) {month += 12;year -= 1;}int c = year / 100;int y = year % 100;int h = (day + 13*(month+1)/5 + y + y/4 + c/4 + 5*c) % 7;return h; // 0=星期六, 1=星期日, ..., 6=星期五 }int main() {int year = 2024, month = 8, day = 15;int week = zeller(year, month, day);const char* weeks[] = {"星期六", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五"};cout << weeks[week]; // 輸出:星期六return 0; }
注意事項
-
月份調整:必須將 1 月、2 月視為上一年的 13、14 月。
-
結果映射:公式中?h=0表示星期六,而非星期日。
-
適用范圍:僅適用于格里高利歷(公歷,1582年10月15日之后)。