想用c语言写一个关于日历的小程序,但是不知道如何计算星期几的问题,网上搜到一个基姆拉尔森公式:

想用c语言写一个关于日历的小程序,但是不知道如何计算星期几的问题,网上搜到一个基姆拉尔森公式:W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7,有人知道这个公式是怎么来的吗?还有别的计算方法吗?

公历一年一月一日是星期一,算出这一天和公历一年一月一日之间的天数就可以了
还有一个算法就是,400年一个循环,也就是401年一月一日也是周一这样可以少算很多天
再就是更简单的算法就是,一年是365天,364天正好是7的倍数,也就是一年多出一天来,这样再把闰年的那一天加上就可以了,这样可以算出每年的第一天是周几,
year%=400; //这是去掉400年的循环
z=(year+year/4-year/100)%7; //这样就可以算出
for(m=1;m<mouth;m++)
//这是算出一年内的到这个月之前的天数,最后再加上这个月的那几天就可以了
{
if(i=1||i==3||i==5||i==7||i==8||i==10||i==12)
d+=31;
if(i==4||i==6||i==9||i==11)
d+=30;
if(i==2)
if(year%4==0&&year%100==0||year%400!=0)
d+=29
else
d+=28
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-14
这个公式是很好的啊,有点注意就行了
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数+1,m表示月份数,y表示年数。
在公式中有个与其他公式不同的地方:
  把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算!!!
第2个回答  2011-11-14
//正好前几天弄过一个计算任意年月日是星期几的小程序
//是以2000年1月1日为参考日计算的,该日是星期六
#include <stdio.h>
int isly(int year)
{
return ((!(year%4))&&(year%100)||(!(year%400)));
}
int mtod(int m)
{
int n=0;
switch(m)
{
case 1:n=31;break;
case 2:n=59;break;
case 3:n=90;break;
case 4:n=120;break;
case 5:n=151;break;
case 6:n=181;break;
case 7:n=212;break;
case 8:n=243;break;
case 9:n=273;break;
case 10:n=304;break;
case 11:n=334;break;
default:n=0;
}
return n;
}
int dmax(int y,int m,int d)
{
if(m==2)
{
return 28+(isly(y));
}
if((m==1||m==3||m==5||m==7||m==8||m==10||m==12))
return 31;
return 30;
}

int main()
{
int y,m,d;
int lyn=0;
int dn=0;
char* cday[]={"六","日","一","二","三","四","五"};

printf("输入年月日:");
do
{
scanf("%d%d%d",&y,&m,&d);
if(m<13&&m>0&&d>0&&d<=dmax(y,m,d))
break;
else
printf("该日期不存在,请重新输入:");
}
while(1);

if(y>=2000)
{
for(int i=2000;i<=y;i++)
{
lyn+=isly(i);
}
if(isly(y))
{
if(m<2||(m==2&&d<=29))
lyn--;
}
dn=(y-2000)*365+mtod(m-1)+d+lyn-1;
printf("%d年%d月%d日是星期%s\n",y,m,d,cday[dn%7]);
}

if(y<2000)
{
for(int i=y;i<2000;i++)
{
lyn+=isly(i);
}
if(isly(y))
{
if(m>2)
lyn--;
}
dn=(2000-y)*365-mtod(m-1)-d+lyn+1;
printf("%d年%d月%d日是星期%s\n",y,m,d,cday[(7-dn%7)%7]);
}
return 0;
}
第3个回答  2011-11-14
我的曾经的做法:我先确定一天是星期几,比如2011.11.11是星期五,那么计算当天与2011.11.11相差多少天,△day%7,如果为0,那么今天就是星期五,以此类推!
相似回答