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日为星期一
程序如下:
/*利用基姆拉尔森计算日期公式 w (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)*/
#include
void CaculateWeekday(int y,int m, int d)
{
int w;//代表星期几
if (m 1 || m 2)
{
m + 12;
y--;
}
w (d+1+2*m + 3*(m+1)/5 +y +y/4 - y/100 +y/400)%7;
switch(w)
{
case 0:
printf("星期天!\n");
break;
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
}
}
int main()
{
int year,month,day;
charch '1';
while(ch ! '\033')
{
printf("\n请输入日期:\n格式为:1900,1,1\n");
scanf("%d,%d,%d",&year,&month,&day);
CaculateWeekday(year,month,day);
flushall();
printf("按 Esc 键退出,其他键继续!");
ch getch();
printf("\n");
flushall();
}
}
运行效果:
请输入日期:
格式为:1900,1,1
2008,4,29
星期二
输入0退出,其他继续:d
2008,1,1
星期二
0 , :l
输入 退出其他继续
2008,8,8
星期五
0 , :0
输入 退出其他继续
请按任意键继续. . .
编者注:用来算现在真实日期的星期是没有问题的。原理是根据已知公元1年1
月1日的星期数来推算。如果在你的题目中约定了某天是星期几,你要注意那天
的星期是否跟真实的星期相同,如果不同,需要考虑相差几天!
如果大家觉得不够过瘾,可以看看以下该公式的推导过程,让大家对历法有个
更深刻的认识下面我们完全按自己的思路由简单到复杂一步步进行推导……
推导之前,先作两项规定:
①用 y,m,d,w 分别表示 年 月 日 星期(w 0-6 代表星期日星期六-
0 1 1
②我们从 公元 年 月 日星期日开始
7 d 17 w 06
一、只考虑最开始的 天,即 变换到
很直观的得到:
w d-1
1
二、扩展到整个 月份
7
模 的概念大家都知道了,也没什么好多说的。不过也可以从我们平常用的日历
中看出来,在周历里边每列都是一个按7增长的等差数列,如1、8、15、22的星
1
期都是相同的。所以得到整个 月的公式如下:
w (d-1) % 7 公式⑴
三、按年扩展
由于按月扩展比较麻烦,所以将年扩展放在前面说
365 365 7 52