蔡勒公式蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几公 式W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1 ( 或 :w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1) 若 要 计 算 的 日 期 是 在 1582 年 10 月 4 日 或 之 前 ,公 式 则 为 w=y+[y/4]+[c/4]-2c+[13(m+1)/5]+d+3 其 中 意 义 : w: 星 期 ; w 对 7 取 模 得 : 0-星 期 日 , 1-星 期 一 , 2-星 期 二 ,3-星 期 三 , 4-星 期 四 , 5-星 期 五 , 6-星 期 六 c: 世 纪 ( 前 两 位 数 ) y: 年 ( 后 两 位 数 ) m: 月 ( m 大 于 等 于 3, 小 于 等 于 14, 即 在 蔡 勒 公 式 中 , 某 年 的 1、 2 月要 看 作 上 一 年 的 13、 14 月 来 计 算 , 比 如 2011 年 1 月 1 日 要 看 作 2010 年 的13 月 1 日 来 计 算 ) d: 日 [ ]代 表 取 整 , 即 只 要 整 数 部 分 。
下 面 以 中 华 人 民 共 和 国 成 立 100 周 年 纪 念 日 那 天 ( 2049 年 10 月 1 日 )来 计 算 是 星 期 几 , 过 程 如 下 : w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1 =49+[12.25]+5-40+[28.6] =49+12+5-40+28 =54 (除 以 7 余 5) 即 2049 年 10 月 1 日 ( 100 周 年 国 庆 ) 是 星 期 五 再 比 如 计 算 2006 年 4 月 4 日 , 过 程 如 下 : w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1 =-12 (除 以 7 余 2, 注 意 对 负 数 的 取 模 运 算 ! ) 注 : 蔡 勒 公 式 只 适 合 于 1582 年 ( 我 国 明 朝 万 历 十 年 ) 10 月 15 日 之 后 的 情形 罗 马 教 皇 格 里 高 利 十 三 世 在 1582 年 组 织 了 一 批 天 文 学 家 , 根 据 哥 白 尼日 心 说 计 算 出 来 的 数 据 , 对 儒 略 历 作 了 修 改 。
将 1582 年 10 月 5 日 到 14 日之 间 的 10 天 宣 布 撤 销 , 继 10 月 4 日 之 后 为 10 月 15 日 后 来 人 们 将 这 一 新 的 历 法 称 为 “格 里 高 利 历 ”, 也 就 是 今 天 世 界 上 所 通用 的 历 法 , 简 称 格 里 历 或 公 历 计 算 代 码1582 年 10 月 4 日 之 后 的 计 算 代 码 如 下 : c 代 码 : #include int main() { int year,month,day; while(scanf("%d%d%d",&year,&month,&day)!=EOF){ int i,j,k; int c=year/100; int y=year-c*100; int week=int(c/4)-2*c+int(y+y/4)+int(13*(month+1)/5)+day-1; while(week using namespace std; int main(){ int year,month,day; while(cin >> year >> month >> day){ if ( month < 3 ) { year -= 1; month += 12; } char b[7][10] = {"sunday","monday","tuesday","wednesday","thursday","friday","saturday"}; int c = int(year / 100), y = year - 100 * c; int w = int(c / 4) - 2*c +y +int(y/4) +(26 * (month + 1)/10 ) + day - 1; w = ( w % 7 + 7 ) % 7; cout << b[w] << endl; Pascal 代 码 : program clgs; var a,b,c,d,x,y:longint; begin readln(a,b,d); if b<3 then begin b:=b+12; a:=a-1; end; y:=a mod 100; c:=a div 100; x:=y+trunc(y/4)+trunc(c/4)-2*c+trunc(13*(b+1)/5+d-1); while x<=7 do x:=x+7; writeln((x-1)mod 7+1); readln; readln; end. 其 他 公 式对 于 计 算 星 期 数 的 公 式 还 有 如 下 的 公 式 : 1.Week=(Day + 2*Month + 3*(Month+1)/5 + Year + Year/4 - Year/100 + Year/400) % 7 ( 其 中 的 Year 是 四 位 数 , 如 2011。
“%”号 是 等 式 除 7 取 余 数 ) 该 式 与 蔡 勒 公 式 有 点 区 别 : “0”为 星 期 1, ……, “6”为 星 期 日 ! 该 式 可 能 与 蔡 勒 公 式 的 计 算 都 是 较 为 复 杂 , 但 有 改 进 的 地 方 : 对 于 世 纪这 个 概 念 不 被 引 用 , 直 接 就 是 计 算 年 代 数 ( 4 位 数 ) 的 , 即 不 用 再 把 世 纪 和 年 代 数 ( 后 两 位 ) 分 开 2.基 姆 拉 尔 森 计 算 公 式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在 公 式 中 d 表 示 日期 中 的 日 数 +1, m 表 示 月 份 数 , y 表 示 年 数 注 意 : 在 公 式 中 有 个 与 其 他 公 式 不 同 的 地 方 : 把 一 月 和 二 月 看 成 是 上 一 年 的 十 三 月 和 十 四 月 , 例 : 如 果 是 2011-1-10 则 换 算 成 : 2010-13-10 来 代 入 公 式 计 算 例 : 2011-10-17 计 算 时 : d=18,m=10,y=2011。
Java 代 码 : string CaculateWeekDay(int y,int m, int d) { if(m==1) m=13; if(m==2) m=14; int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; string weekstr=""; switch(week) { case 1: weekstr="星 期 一 "; break; case 2: weekstr="星 期 二 "; break; case 3: weekstr="星 期 三 "; break; case 4: weekstr="星 期 四 "; break; case 5: weekstr="星 期 五 "; break; case 6: weekstr="星 期 六 "; break; case 7: weekstr="星 期 日 "; break; } return weekstr; } 3.( Year+Year/4+Year/400-Year/100-年 基 数 +月 基 数 +Day) /7=……余 Week( 星 期 几 ) 。
【 注 : 式 中 分 数 均 取 整 】年 基 数 : 平 年 1,闰 年 2, 月 基 数 :1、 平 年 : 一 月 0, 二 月 3, 三 月 3, 四 月 6, 五 月 1, 六 月 4, 七 月 0, 八 月 3, 九 月 5, 十 月 0, 十 一 月 3, 十 二 月 5.2、 闰 年 : 一 月 0, 二 月 3, 三 月 4, 四 月 0, 五 月 2, 六 月 5, 七 月 0, 八 月 3, 九 月 6, 十 月 1, 十 一 月 4, 十 二 月 6.如 : 1949 年 10 月 1 日 是 星 期 几 ? ( 1949+1949/4+1949/400-1949/100-1+0+1) /7=( 1949+487+4-19-1+0+1) /7=345……6 即 该 日 为 星 期 六 所 谓 月 基 数 , 就 是 前 几 个 月 日 数 总 和 的 7 余 数 , 如 1 月 基 数 , 前 面 月 数的 日 数 总 和 的 7 余 数 为 0,则 该 月 的 基 数 就 是 0, 如 4 月 ( 闰 年 ) 基 数 , 前 面三 个 月 的 日 数 总 和 为 : ( 31+29+31) /7=91/7……0 为 了 简 化 运 算 , 先 取 各月 7 余 数 , 再 相 加 , 再 取 7 余 数 : ( 3+1+3) /7……0, 即 4 月 基 数 为 0,为了 加 快 计 算 速 度 , 通 常 是 将 平 年 和 闰 年 的 月 基 数 编 成 基 数 表 , 直 接 查 算 。
月 基 数 , 1、 平 年 : 一 月 0, 二 月 3, 三 月 3, 四 月 6, 五 月 1, 六 月 4, 七月 0, 八 月 3, 九 月 5, 十 月 0, 十 一 月 3, 十 二 月 5. 2、 闰 年 : 一 月 0, 二月 3, 三 月 4, 四 月 0, 五 月 2, 六 月 5, 七 月 0, 八 月 3, 九 月 6, 十 月 1, 十 一 月 4, 十 二 月 6.。