C语言根据日期判断星期几(使用基姆拉尔森计算公式)
算法如下:
基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
以公元元年为参考,公元元年1月1日为星期一
c程序简单就不列了,注意算出来取模后结果为0是星期一,1是星期二
#include<iostream>
using namespace std;
int main()
{
int y,m,d;
cin >> y >> m >> d;
if(m==1||m==2){m+=12;y--;}
cout << (int)((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400))%7;
return 0;
}
推到过程:
d+2是在补2月挪到末位的日期差
2*m+3*(m+1)/5 实际是(-1+2*m+3*(m+1)/5)%7,实际输出值是
2 4 0 3 5 1 3 6 2 4 0 2 5 1
是每个月的误差
月 误差 累计 模7
3 3 0 0
4 2 3 3
5 3 5 5
6 2 8 1
7 3 10 3
8 3 13 6
9 2 16 2
10 3 18 4
11 2 21 0
12 3 23 2
13 3 26 5
14 - 29 1
最后y+y/4-y/100+y/400 是闰年误差