任意一天的星期数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
=5+来自百度文库6+3=24
24%7=3,即:星期三。作为参考,在下文中,已经列出了 21 世纪的所有年份的代码。
21 世纪年份代码参考:
年份 代码
年份 代码
年份 代码
年份 代码
2000 0
2025 3
2050 6
2075 2
2001 1
2026 4
2051 0
2076 4
2002 2
2027 5
2052 2
#include<stdio.h> #include<math.h> int xingqipanduan(int N,int Y,int R) {
int nian[10]; int ab,cd,t; int niandaima; int yuedaima[12]={6,2,2,5,0,3,5,1,4,6,2,4};/*月代码*/ if((N%4==0&&N%100!=0)||N%400==0)/*如果是闰年,、月代码相应变化*/
t=niandaima+yuedaima[Y-1]+R;
t=t-t/7*7;
/*t即为所求的星期,若为零则为星期日*/
return(t);
}
void main()
{
int nian,yue,ri;
int xingqi;
printf("输入年、月、日\n");
scanf("%d%d%d",&nian,&yue,&ri);
例如,要求出 2061 年的年份代码,我们只需要这样做就可以了:61÷4=15…1,而 15+61=76;由于 76÷7=10…6,即 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 世纪的年份),123%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,所以这一天是星期日。 那么,在计算 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 月 14 日是:月份代码+日期代码+年份代码=4+14+0=18 而 18%7=4,所以这一天的确是星期四。不过,我们这个公式对于早期时代的日期是不 起作用的,因为当时采用的是儒略历(现今国际通用的公历的前身)。 最后,需要指出的,根据格林高利历法,闰年每四年一次,而能够被 100 整除的年份 除外,但是能够被 400 整除的年份例外。也就是说,能够被 400 整除的年份同样是闰年。所 以,1600 年、2000 年、2400 年、2800 年等都是闰年,而 1700 年、1800 年、1900 年、2100 年、2200 年、2300 年和 2500 年等都不是闰年,尽管他们都能被 4 整除(但不能被 400 整除)。 事实上,格林高利历法是每 400 年一个轮回,所以你可以将未来的任意一天转换成距离 2000 年最近的一天。例如,2361 年 3 月 19 日和 2761 年 3 月 19 日的星期数同 1961 年 3 月 19 日 的星期数是一样的,即:星期日。 下面给出用 C 语言编写的一个小程序来判断任意年份的某一天的星期数:
接下来,我们还需要用数字代表一年当中的 12 个月。这些数字适用于任何年份,不
过有两个例外。在诸如 2000、2004 或者 2008 年这样的闰年,1 月份的代码是 5,2 月份的
代码则是 1。为了便于记忆月份的代码,我们提供了一个记忆的列表:
月份
数字代码
一月
6*
二月
2*
三月
2
四月
5
五月
0
六月
3
七月
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,ri); break; case 4: printf("%d年%d月%d日是星期四\n",nian,yue,ri); break; case 5: printf("%d年%d月%d日是星期五\n",nian,yue,ri); break; case 6: printf("%d年%d月%d日是星期六\n",nian,yue,ri); break; } }
年等等,一直到接下来的年份。我们将不仅知道将来某一天是星期几,而且还会知道过去的
某一天是星期几,甚至几个世纪以前的某一天是星期几。
每个月、每个星期的每一天都有一个数字代码,而每一年也都有一个数字代码,而 2006
年的数字代码刚好为 0(关于年份的数字代码,见下文)。
知道了年份的数字代码后,要知道某一天的星期数,只需要把月份代码与日期代码和年
之变化呢?大多数的年份一共有 365 天,而且由于 364 是 7 的倍数(7×52=364)。所以,在
大多数的年份,你的生日的星期数会随之向前推移 1 天。如果你的两个生日之间有 366 天,
那么你的生日的星期数会随之向前推移 2 天。至于 2007 年的任意一天的星期数,其计算方
法同 2006 年一样,只不过它的年份代码由 06 年的 0 变成 07 年的 1 了。接下来的 2008 年是
份代码简单地相加就可以了。例如,要知道 2006 年 12 月 3 日的星期数,只需按照下面的步
骤去做就可以了:月份代码+日期代码+年份代码=4+3+0=7
因为 7 代表星期日,所以,2006 年 12 月 3 日是星期日。
那么,2006 年 11 月 18 日呢?我们已经知道 11 月份的代码是 2,所以:月份代码+日期
2009 4
2034 0
2059 3
2084 0
2010 5
2035 1
2060 5
2085 1
2011 6
2036 3
2061 6
2086 2
2012 1
2037 4
2062 0
2087 3
2013 2
2038 5
2063 1
2088 5
2014 3
2039 6
2064 3
2089 6
2015 4
首先,我们指定一个数字代表一个星期数,这些数都是很容易记住的:
数字
星期数
1
星期一
2
星期二
3
星期三
4
星期四
5
星期五
6
星期六
7 或者 0 星期日
上面的这个列表是很容易记住的,因为这些数字与星期数几乎是一一对应的——当
然,星期日除外。不过,我们通常也有把星期日看作是星期七的做法。所以,记住这个列
表是很容易的事情。
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+cd+3)%7;
if((ab+3)%4==0)
niandaima=(cd/4+cd+5)%7;
闰年(闰年每四年一次,所以 21 世纪的闰年还包括 2000 年、2004 年、2008 年…2096 年)。
因此,2008 年的年份代码要加上 2,也就是 3 了。接下来的 2009 年不是闰年,因此,它的
年份代码是 4。例如,2007 年 5 月 2 日的星期数是:月份代码+日期代码+年份代码=0+2+1=3
2040 1
2065 4
2090 0
2016 6
2041 2
2066 5
2091 1
2017 0
2042 3
2067 6
2092 3
2018 1
2043 4
2068 1
2093 4
2019 2
2044 6
2069 2
2094 5
2020 4
2045 0
2070 3
2095 6
2021 5
2046 1
5
八月
1
九月
4
十月
6
十一月
2
十二月
4
(*代表在闰年,1 月份的代码为 5,而二月份的代码为 1)
记忆方法:一月和十月为 6;二月、三月和十一月为 2;四月、七月为 5;五月为 0;六
月为 3;八月为 1;九月和十二月为 4。
现在,我们来计算一下 2006 年任何一天的星期数吧。此后,我们计算 2007,然后是 2008
2077 5
2003 3
2028 0
2053 3
2078 6
2004 5
2029 1
2054 4
2079 0
2005 6
2030 2
2055 5
2080 2
2006 0
2031 3
2056 0
2081 3
2007 1
2032 5
2057 1
2082 4
2008 3
2033 6
2058 2
2083 5
2071 4
2096 1
2022 6
2047 2
2072 6
2097 2
2023 0
2048 4
2073 0
2098 3
2024 2
2049 5
2074 1
2099 4
值得庆幸的是,我们没有必要记住这个表格的内容,因为我们可以心算出 2000 年至 2099 年任意年份的代码。要求出 2000+X 年份的代码,我们只需要用 X 除以 4(忽略余数),然 后再与 X 相加,除以 7 就可以了,所得到的余数就是该年份的代码。
{
yuedaima[0]=5;
yuedaima[1]=1;
}
int a,i,n=0;
a=N;
i=0;
while(a!=0)
{
nian[i]=a%10;
a=a/10;
i++;
n++;
}
cd=nian[0]+10*nian[1];
ab=0;
for(i=2;i<n;i++)
ab=int(ab+nian[i]*pow(10,i-2));
所以,这一天是星期三。
那么,2008 年 9 月 9 日呢?这一天的星期数是:月份代码+日期代码+年份代码
=4+9+3=16
16%7=2,所以这一天是星期二。
那么,2008 年 1 月 16 日呢?对于这个日期,我们就要考虑 2008 年是闰年这一因素了,
因为闰年 1 月份的代码是 5,而不是常年的 6.由于:月份代码+日期代码+年份代码
代码+年份代码=2+18+0=20
因为每周是七天,所以我们可以用这个结果减去 7 的任意倍数(7、14、21、28、35…),
而星期数却不会变。所以,下一步就是要减去比这个结果小、但却是最大的 7 的倍数,也就
是除 7 取余,即:20%7=6,因此,2006 年 11 月 18 日是星期六。
那么,2007 年任意一天的星期数呢?随着年份的变化,你的生日的星期数是不是也随