C语言 假定2000年1月1日周六,用户输入年、月、日后计算这一天是周几?

主要是怎么算总天数,能解释一下嘛

W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1
w:0-6对应星期日-星期六 c:世纪-1(前两位数)y:年(后两位数)m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,d:日[ ]代表取整,即只要整数部分。这个是蔡勒(Zeller)公式
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-05
#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;
}
第2个回答  2011-11-04
参考我blog里面的一个代码

参考资料:http://hi.baidu.com/wanfustudio/ihome/myblog

相似回答