NYOJ--An problem about date

本来这个问题没有贴出来的必要,因为狠狠简单。但是觉得我们不应该只是在这一味的刷题,学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; } 这是我们应用计算机编写程序可以很简答的得到问题的答案,但是如果是在现实生活中呢?我们身边没有电脑,又该怎么去计算快速得到答案呢?

方法如下:

方法概述

  • 只需要知道三个代码
    日期代码+月份代码+年份代码
    就可以秒算任意年份任意日期的星期数

方法

  1. 日期代码指的是日期数,如3月18号,日期代码为18。4月7号,日期代码为7。
  2. 月份代码(需要小小记忆)
    五月 是 0
    八月 是 1
    二月 三月 十一月 是 2
    六月 是 3
    九月 十二月 是4
    四月 七月 是5
    一月 十月 是 6
    如果遇到闰年 则二月代码变为1,一月代码变为5,其它不变。即,非闰年的月份代码为622503 514624,闰年的月份代码为512503 514624。
  3. 年份代码
    举个例子 2010年的代码,我们用尾数10除以4(忽略余数)再加上10得到数字12,再用12除以7,得到的余数5就是2010年的代码。
    也就是说,心算出2000到2099任意年份的代码,只需将其后两位数X除以4(忽略余数),然后与X相加,并除以7就可以了,得到的余数就是其年份代码。10年的年份代码是5,11年年份代码为6。
  4. 秒算任意日期的星期数
    ,我们算一下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得到的余数为星期数


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值