本来这个问题没有贴出来的必要,因为狠狠简单。但是觉得我们不应该只是在这一味的刷题,学c语言。更多的时候更应该关注一下生活中的那些小细节,小规律。所以特意写了这篇博客。
用到的公式:k=(Day +1+ 2*Month + 3*(Month+1)/5 + Year + Year/4 - Year/100 + Year/400) % 7;唯一需要注意的地方就是1月和2月算作上年的13月,和14月。这样就完美了。
原题地址:点击打开链接。
代码如下:
#include<stdio.h> int main() { int year,mouth,day,k,l; while(scanf("%d %d %d",&year,&mouth,&day)!=EOF) { if(mouth==1) {mouth=13;year-=1;} if(mouth==2) {mouth=14;year-=1;} k=1+day+2*mouth+3*(mouth+1)/5+year/400-year/100+year+year/4; l=k%7; printf("%d\n",l); }return 0; } 这是我们应用计算机编写程序可以很简答的得到问题的答案,但是如果是在现实生活中呢?我们身边没有电脑,又该怎么去计算快速得到答案呢?
方法如下:
方法概述
- 只需要知道三个代码
日期代码+月份代码+年份代码
就可以秒算任意年份任意日期的星期数
方法
- 日期代码指的是日期数,如3月18号,日期代码为18。4月7号,日期代码为7。
- 月份代码(需要小小记忆)
五月 是 0
八月 是 1
二月 三月 十一月 是 2
六月 是 3
九月 十二月 是4
四月 七月 是5
一月 十月 是 6
如果遇到闰年 则二月代码变为1,一月代码变为5,其它不变。即,非闰年的月份代码为622503 514624,闰年的月份代码为512503 514624。 - 年份代码
举个例子 2010年的代码,我们用尾数10除以4(忽略余数)再加上10得到数字12,再用12除以7,得到的余数5就是2010年的代码。
也就是说,心算出2000到2099任意年份的代码,只需将其后两位数X除以4(忽略余数),然后与X相加,并除以7就可以了,得到的余数就是其年份代码。10年的年份代码是5,11年年份代码为6。 - 秒算任意日期的星期数
如,我们算一下2010年4月25日
日期代码25
月份代码5
年份代码5
日期代码+月份代码+年份代码=25+5+5=35
35是7的倍数,所以2010年4月25日是星期日
再比如算一下2010年10月1日
日期代码1
月份代码6
年份代码5
日期代码+月份代码+年份代码=1+6+5=12
12除以7余5,所以2010年10月1日是星期五
如果得到的代码和是小于7的数,那么此数直接是星期数
如果得到的代码和是大于7的数,那么将该数除以7得到的余数为星期数。