《任意一天的星期数》由会员分享,可在线阅读,更多相关《任意一天的星期数(5页珍藏版)》请在金锄头文库上搜索。
1、首先,我们指定一个数字代表一个星期数,这些数都是很容易记住的:数字 星期数1 星期一2 星期二3 星期三4 星期四5 星期五6 星期六7 或者 0 星期日上面的这个列表是很容易记住的,因为这些数字与星期数几乎是一一对应的当然,星期日除外。不过,我们通常也有把星期日看作是星期七的做法。所以,记住这个列表是很容易的事情。接下来,我们还需要用数字代表一年当中的 12 个月。这些数字适用于任何年份,不过有两个例外。在诸如 2000、2004 或者 2008 年这样的闰年,1 月份的代码是 5,2 月份的代码则是 1。为了便于记忆月份的代码,我们提供了一个记忆的列表:月份 数字代码一月 6*二月 2*三
2、月 2四月 5五月 0六月 3七月 5八月 1九月 4十月 6十一月 2十二月 4(*代表在闰年,1 月份的代码为 5,而二月份的代码为 1)记忆方法:一月和十月为 6;二月、三月和十一月为 2;四月、七月为 5;五月为 0;六月为 3;八月为 1;九月和十二月为 4。现在,我们来计算一下 2006 年任何一天的星期数吧。此后,我们计算 2007,然后是2008 年等等,一直到接下来的年份。我们将不仅知道将来某一天是星期几,而且还会知道过去的某一天是星期几,甚至几个世纪以前的某一天是星期几。每个月、每个星期的每一天都有一个数字代码,而每一年也都有一个数字代码,而2006 年的数字代码刚好为 0
3、(关于年份的数字代码,见下文) 。知道了年份的数字代码后,要知道某一天的星期数,只需要把月份代码与日期代码和年份代码简单地相加就可以了。例如,要知道 2006 年 12 月 3 日的星期数,只需按照下面的步骤去做就可以了:月份代码+日期代码+年份代码=4+3+0=7因为 7 代表星期日,所以,2006 年 12 月 3 日是星期日。那么,2006 年 11 月 18 日呢?我们已经知道 11 月份的代码是 2,所以:月份代码+日期代码+ 年份代码=2+18+0=20因为每周是七天,所以我们可以用这个结果减去 7 的任意倍数(7、14、21、28、35) ,而星期数却不会变。所以,下一步就是要减
4、去比这个结果小、但却是最大的 7 的倍数,也就是除 7 取余,即:20%7=6,因此,2006 年 11 月 18 日是星期六。那么,2007 年任意一天的星期数呢?随着年份的变化,你的生日的星期数是不是也随之变化呢?大多数的年份一共有 365 天,而且由于 364 是 7 的倍数(752=364) 。所以,在大多数的年份,你的生日的星期数会随之向前推移 1 天。如果你的两个生日之间有 366天,那么你的生日的星期数会随之向前推移 2 天。至于 2007 年的任意一天的星期数,其计算方法同 2006 年一样,只不过它的年份代码由 06 年的 0 变成 07 年的 1 了。接下来的2008 年是
5、闰年(闰年每四年一次,所以 21 世纪的闰年还包括 2000 年、2004 年、2008年2096 年) 。因此,2008 年的年份代码要加上 2,也就是 3 了。接下来的 2009 年不是闰年,因此,它的年份代码是 4。例如,2007 年 5 月 2 日的星期数是:月份代码+日期代码+年份代码=0+2+1=3所以,这一天是星期三。那么,2008 年 9 月 9 日呢?这一天的星期数是:月份代码+日期代码+年份代码=4+9+3=1616%7=2,所以这一天是星期二。那么,2008 年 1 月 16 日呢?对于这个日期,我们就要考虑 2008 年是闰年这一因素了,因为闰年 1 月份的代码是 5,
6、而不是常年的 6.由于:月份代码+日期代码+年份代码=5+16+3=2424%7=3,即:星期三。作为参考,在下文中,已经列出了 21 世纪的所有年份的代码。21 世纪年份代码参考:年份 代码2000 02001 12002 22003 32004 52005 62006 02007 12008 32009 42010 52011 62012 12013 22014 32015 42016 62017 02018 12019 22020 42021 52022 62023 02024 2年份 代码2025 32026 42027 52028 02029 12030 22031 32032 52
7、033 62034 02035 12036 32037 42038 52039 62040 12041 22042 32043 42044 62045 02046 12047 22048 42049 5年份 代码2050 62051 02052 22053 32054 42055 52056 02057 12058 22059 32060 52061 62062 02063 12064 32065 42066 52067 62068 12069 22070 32071 42072 62073 02074 1年份 代码2075 22076 42077 52078 62079 02080 2208
8、1 32082 42083 52084 02085 12086 22087 32088 52089 62090 02091 12092 32093 42094 52095 62096 12097 22098 32099 4值得庆幸的是,我们没有必要记住这个表格的内容,因为我们可以心算出 2000 年至2099 年任意年份的代码。要求出 2000+X 年份的代码,我们只需要用 X 除以 4(忽略余数) ,然后再与 X 相加,除以 7 就可以了,所得到的余数就是该年份的代码。例如,要求出 2061 年的年份代码,我们只需要这样做就可以了:614=151,而15+61=76;由于 767=106,即
9、 76%7=6,所以,2061 年的年份代码为 6。所以,2061 年 3 月 19 日的星期数是:月份代码+日期代码+年份代码=2+19+6=27因为 27%7=6,所以这一天是星期六。那么,20 世纪的生日呢?其计算方法是完全一样的,其不同之处在于将最终的结果向前推移 1 天(或者只要将年份代码加 1 就可以了) 。因此,1961 年 3 月 19 日是星期日。那么 1998 年 12 月 3 日呢?因为 98/4=24(余数忽略不计),所以 1998 年的年份代码为98+24+1=123(对于 20 世纪,求年份代码要加 1,因为上述那个年份代码的计算方法只适用 21 世纪的年份) ,1
10、23%7=4,因此,1998 年的年份代码为 4。所以,1998 年 12 月 3 日的星期数是:月份代码+日期代码+年份代码=4+3+4=11,而 11%7=4,即:这一天是星期四。而计算 19 世纪任意一天的星期数时,其年份的代码要(在 21 世纪年份的基础上)加上 3。例如,英国博物学家查尔斯达尔文和美国第十六任总统亚伯拉罕林肯都出生于1809 年 2 月 12 日。因为 2009 年的年份代码为 4,所以 1809 年的年份代码是 4+3=7,也就是 0。因此,达尔文和林肯出生的这一天是:月份代码+日期代码+年份代码=2+12+0=14而 14%7=0,所以这一天是星期日。那么,在计算
11、 22 世纪任意一天的星期数时,其年份的代码要(在 21 世纪的基础上)加上 5 或减去 2(二者的结果都是一样的) 。例如,因为 2009 年的年份代码是 4,所以2109 年的年份代码为 4+5=9,而 9-7=2,即 2。18 世纪的年份代码则同 22 世纪的年份代码完全一样。不过,有一点需要注意的是,因为我们这个运算是基于 1582 年确立的格林高利历法,而英国只是从 1752 年才开始采用这个历法的。在当时,9 月 2 日是星期三,而 9 月14 日则是星期四。我们还是来证实一下吧!由于 2052 年的年份代码是 2,所以,1752 年的年份代码是 0。因此,1752 年 9 月 1
12、4 日是:月份代码+日期代码+年份代码=4+14+0=18而 18%7=4,所以这一天的确是星期四。不过,我们这个公式对于早期时代的日期是不起作用的,因为当时采用的是儒略历(现今国际通用的公历的前身) 。最后,需要指出的,根据格林高利历法,闰年每四年一次,而能够被 100 整除的年份除外,但是能够被 400 整除的年份例外。也就是说,能够被 400 整除的年份同样是闰年。所以,1600 年、2000 年、2400 年、2800 年等都是闰年,而 1700 年、1800 年、1900 年、2100 年、2200 年、2300 年和 2500 年等都不是闰年,尽管他们都能被 4 整除(但不能被40
13、0 整除) 。事实上,格林高利历法是每 400 年一个轮回,所以你可以将未来的任意一天转换成距离 2000 年最近的一天。例如,2361 年 3 月 19 日和 2761 年 3 月 19 日的星期数同1961 年 3 月 19 日的星期数是一样的,即:星期日。下面给出用 C 语言编写的一个小程序来判断任意年份的某一天的星期数:#include#includeint xingqipanduan(int N,int Y,int R)int nian10;int ab,cd,t;int niandaima;int yuedaima12=6,2,2,5,0,3,5,1,4,6,2,4;/*月代码*/
14、if(N%4=0&N%100!=0)|N%400=0)/*如果是闰年,、月代码相应变化*/yuedaima0=5;yuedaima1=1;int a,i,n=0;a=N;i=0;while(a!=0)niani=a%10;a=a/10;i+;n+;cd=nian0+10*nian1;ab=0;for(i=2;in;i+)ab=int(ab+niani*pow(10,i-2);if(ab%4=0) /*计算相应的年代码*/niandaima=(cd/4+cd)%7;if(ab+1)%4=0)niandaima=(cd/4+cd+1)%7;if(ab+2)%4=0)niandaima=(cd/4+
15、cd+3)%7;if(ab+3)%4=0)niandaima=(cd/4+cd+5)%7;t=niandaima+yuedaimaY-1+R;t=t-t/7*7; /*t即为所求的星期,若为零则为星期日*/return(t);void main()int nian,yue,ri;int xingqi;printf(输入年、月、日n);scanf(%d%d%d,xingqi=xingqipanduan(nian,yue,ri);switch(xingqi)case 0:printf(%d年%d月%d日是星期日n,nian,yue,ri);break;case 1:printf(%d年%d月%d日是星期一n,nian,yue,ri);break;case 2:printf(%d年%d月%d日是星期二n,nian,yue,ri);break;case 3:printf(%d年%d月%d日是星期三n,nian,yue,