|
![]() | 作者: 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号