论坛: 编程破解 标题: 年历系统问题??? 复制本贴地址    
作者: sniper167 [sniper167]    论坛用户   登录
/*
日历问题首先要解决闰年问题:
若年份数Y是400倍数,则为闰年,若Y非100的倍数但为4的倍数,则为闰年。!(y%400)||!(y%4)&& y%100

然后求元旦是星期几?
一年365日即52周多一天,由公元元年元旦是星期一、2年元旦是星期二、……5年元旦是星期6(因为4年是闰年多一天)计算Y年前年份数与闰年数可得当年元旦是星期几。w=y+y/4-y/100+y/400+1;w%=7;

关于季节:3-5春季、……每三个月一季,以月份数除以3整可分四季。

*/
#include <stdio.h>

void main()
{
int mm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int y,w,i,j;
printf("%s","please input year:\t");
scanf("%d",&y);
if(!(y%400)||!(y%4)&& y%100)
mm[2]=29;
y--;
w=y+y/4-y/100+y/400+1;
w%=7;
y++;
for(i=1;i<13;i++)
{
switch (i/3)
{case 1:
printf("\n\t\t%d%s\n",i," spring.");
break;
case 2:
printf("\n\t\t%d%s\n",i," summer.");
break;
case 3:
printf("\n\t\t%d%s\n",i," autumn.");
break;
default:
printf("\n\t\t%d%s\n",i," winter.");
}
printf("  SUN  MON  TUE  WED  THU  FRI  SAT\n");
for(j=0;j<w;j++)
printf("    ");
for(j=1;j<=mm[i];j++)
{
printf("%5d",j);
w++;
if(w==7){printf("\n");w=0;}
}
}
}



计算Y年前年份数与闰年数可得当年元旦是星期几。w=y+y/4-y/100+y/400+1;w%=7;?????????????
这里不懂






地主 发表时间: 04-03-30 21:58

回复: 286 [unique]   版主   登录
一年365日即52周多一天,由公元元年元旦是星期一、2年元旦是星期二、……5年元旦是星期6(因为4年是闰年多一天)计算Y年前年份数与闰年数可得当年元旦是星期几。

w=y+y/4(闰年数)-y/100(非闰年却算成闰年数)+y/400(仍然是闰年数)+1;
w%=7;//求模即星期数。

实际处理一般不采用这种笨方法,而是用difftime()函数算出两天之间的秒数。
除以(60*60*24)行到天数。除以7的余数即为星期数。当然要随便指一个参照星期数。

B1层 发表时间: 04-03-31 09:47

回复: sniper167 [sniper167]   论坛用户   登录



B2层 发表时间: 04-04-01 10:44

回复: 286 [unique]   版主   登录
1 今天是星期一,7000天后是星期几呢?
7000=7*1000(也就是1000周),所以7000天后仍然为星期一。怎么算呢?其实人们只关心除以7后的余数,而不关心除的结果。因此,7000天后=星期一+7000%7=星期一+0=星期一。
这就是w%=7;。也就是说知道某一天是星期几,想知道n天后是星期几,只是知道中间天数模7的结果就可以。

2 计算当天与公元元年元旦之间的天数,然后%7,看结果再加1,就可知道那天星期几。加1是因为计算当天与公元元年元旦之间的天数未包括元旦那一天。

3 既然是求模7,则其间所有7的倍数都可不管。一年365天=7*52+1,因此7*52可不计。
因此w=y+y/4-y/100+y/400+1;

如果还看不懂,看下式:
某天星期=(二者之间间隔天数+1)%7
        =(二者之间年间隔*365+二年之间闰年个数+1)%7
即:
w=(y*365+y/4-y/100+y/400+1)%7
=(y*(7*52+1)+y/4-y/100+y/400+1)%7
=(y+y/4-y/100+y/400+1+y*7*52)%7
=(y+y/4-y/100+y/400+1)%7+y*7*52%7
=(y+y/4-y/100+y/400+1)%7






B3层 发表时间: 04-04-01 15:03

回复: kailangq [kailangq]   版主   登录


B4层 发表时间: 04-04-02 04:06

回复: sniper167 [sniper167]   论坛用户   登录
感谢286
终于明白了

公元1年1月1 日是星期一!
每四年一闰,但整百年时须为400倍数才闰(如1900平年,2000闰年)
平年365天为52周多一天(365/7=52……1)
因此 2/1/1 星期二、3/1/1星期三、4/1/1星期四……
但闰年2月多一天,下一年元旦就向后推一个星期数(如5/1/1星期六)
w=y(以前过了多少年)+y/4(有几个闰年)-y/100(去掉多算的年数)+y/400(加上漏算的年数)+1(加今年元旦);w%=7;(取余是为了把星期八变成星期一……)


B5层 发表时间: 04-04-02 19:57

回复: lqfrla [lqfrla]   论坛用户   登录
看的我有点烦

B6层 发表时间: 04-04-04 07:22

回复: jiaoyulao [jiaoyulao]   论坛用户   登录


B7层 发表时间: 04-04-04 18:51

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号