蔡勒公式计算星期数

前言

根据往年题目,蓝桥杯当中必不可少的一些题目就是计算某年某日是星期几这种问题
如果按照我之前的思路。一般都是从已知的公元一世纪1月1日是星期一使用循环推到目标天数,中间计算是闰年还是平年,最后得到相差多少天,然后取余7得到最终结果。
基本上一大段下来,十来行代码。今天了解到了蔡勒公式,通过一个公式就可以达到计算星期几。

公式

Snipaste_2020-02-13_20-12-56.png

其中:

  • W 是星期数。
  • c 是世纪数减一,也就是年份的前两位。
  • y 是年份的后两位。
  • m 是月份。m 的取值范围是 3 至 14,因为某年的1、2 月要看作上一年的 13、14月,比如 2019 年的 1 月 1 日要看作 2018 年的 13 月 1 日来计算。
  • d 是日数。
    [ ] 是取整运算。 mod 是求余运算。

那么假设要计算的年份是2020年2月13日,代入公式便是:
D = (20/4)-(202) + 20 + (20/4) + ((13(2+1))/5) + 13 - 1
表面上的确如此,但不要忘记,如果我们计算的年份是1月或2月,理应修改成上年的13月或14月!
最终公式为:
D = (20/4)-(202) + 19 + (19/4) + ((13(14+1))/5) + 13 - 1
D = 39
W = D % 7
= 4
最终计算出,2020年2月13日这一天是星期四,查看日历的确如此。算起来有一些麻烦,那么我们使用代码就比较简单了。

    public static int f(int c,int y,int m,int d){
    if (m == 1 || m == 2) {
        y--;
        m+=12;
    }
    int D = (c/4) - (2*c) + y + (y/4)+(13*(m+1))/5 + d - 1;
    return (D)%7;
}
# 算法