*************************************************/ void main() { init(); while(1) { keyscan();//不停的检测按键是否被按下 } }
第5卷 第4期中 国 水 运Vol.5No.4 2007年4月China Water TransportApril2007
万年历算法研究及实现
张剑锋 陈慕君
摘 要:万年历是一个经典的算法问题,在教学过程中可以作为实例进行分析讲解,具有较高的学习分析价值,也具有一定的实用价值,结合不同的方法,本文有一个系统全面的介绍。 关键词:万年历 算法 阴历 阳历 闰年
中图分类号:TP29文献标识码:A文章编号:1006-7973(2007)04-0143-02
万年历是一个古老而又经典的算法问题,已经有不少的实现方法,但是都多少会存在一些问题和不足,在这里对此算法做一个系统的分析与介绍,先撇去农历与公历之间的转化,只做公历与星期的讨论。
注意这样一个事实:从公元元年一月一日开始到现在,每一天都是连续的,而每个星期有七天,也是连续的,也就是说日期和星期是的,没有断档现象。基本思想是:计算出当前天是从公元元年一月一日开始的第几天,再利用星期的周期性来计算公元任何一天是星期几。
假设当前年份为y,并忽略闰年,则从公元元年一月一日到y-1年共有365*(y-1)天,加上闰年多出来的天数,即加
上
1*
((y-1)/4-(y-1)/100+(y-1)/400)
,
得
365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)。
我们再补上从当前1月1日开始到当前天的天数e,即为所求。
即365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e。 它的值即为当前天是从公元元年一月一日开始算起的第几天。补上一个x(x是与公元元年一月一日是星期几有关的一个0~6的整数),并将这个表达式赋给变量t,即:t=x+365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e,再用t除以7,余几即为星期几(余0为星期日)。
下面讨论x的求法,如果知道公元元年一月一日是星期几,就可以直接得到x的值,但现在公式还没有求出来,不知道公元元年一月一日是星期几。不过没关系,毕竟知道最近的日期是星期几。不妨看一下2001年1月1日是星期几,结果是星期一,代入公式得t=x+730516,用730516除以7,得104355,余数是1,则为了保证2001年1月1日是星期一,取x 为0,所以公元元年一月一日也是星期一。至此,得到了完整的公式:
t=365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e, 再将它做一下改进,我们将公式变形为:
t=(52*7+1)*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e, 利用星期的周期性,将52*7+1从公式中删除为: t=(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e,
T"};
void main( ) {
int d,m,y,e,t,f;
printf("INPUT THE DAY:");scanf("%d",&d);
printf("INPUT THE MONTH:");scanf("%d",&m);
printf("INPUT THE YEAR:");scanf("%d",&y);switch(m){
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-26593-31.html
晚安#易烊千玺#