公式

基姆拉尔森计算公式

w = ( day + 2month +3(month+1)/5 + year + year/4 - year/100 +year/400)%7

根据已知公元1年1月1日星期一来推算。
其中,要把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。

代码

#include <stdio.h>void main()
{char weekname[][10]={"Monday","Tuseday","Wednesday","Thursday","Friday","Saturday","Sunday"};int year;int month;int day;printf("请输入年份:");scanf("%d",&year);printf("请输入月份:");scanf("%d",&month);printf("请输入日期:");scanf("%d",&day);if((month == 1) || (month == 2)){month += 12;year--;}int w;w = (day+2*month+3*(month + 1)/5+year+year/4-year/100+year/400)%7;printf("%d/%d/%d 这一天是%s\n",year,month,day,weekname[w]);
}

推导

计算第一个月:

w = (day-1) % 7

计算年:
在不是闰年的情况下,一年365天,365%7=1,因此相同X月X日第二年会比第一年的星期数多1。
闰年一年366天,如果是在闰年当年2月29号之后的日子,星期数会比上一年多2.
为了公式的简洁,将一年的1、2月份归为上一年的13、14月,year-=1,计算年导致的星期数偏差。
闰年的定义是:能被4整除且不能被100整除,或者能被400整除的年份。
因此公式变为

w = ( day-1 + year-1 + year/4 - year/100 +year/400)%7

计算月份:
一个月30天的话,30%7=2,下个月X号的星期数会多2;一个月31天,31%7=3,下个月X号的星期数会多3.

因为闰年的情况在上面计算年时已经考虑过了,因此2月就直接按照28天计算。并且没有1、2月,只有13、14月。

3月:2月28天整除7,1月31天,所以3月X日会比1月X日的星期数多3
4月:3月31天,比上月的星期数多3
5月:4月30天,比上月星期数多2
……
13月:12月31天,比上月的星期数多3
14月:13月31天,比上月的星期数多3
以此类推,可知不是多3就是多2,将2*(month-2)提取出来后,可以得到:

月份 比上月星期数增加 累计
3 1 1
4 1 2
5 0 2
6 1 3
7 0 3
8 1 4
9 1 5
10 0 5
11 1 6
12 0 6
13 1 7
14 1 8

从month=3开始,每月会比上月增加2天外,还会按照11010的规律增加。因此月份的延迟天数应该为:
2*(month-2)+这月之前(含当月)累计多3的月数
从公式中得到启发,3*i/5的结果是:

i 3*i 3*i/5 比i-1增加
0 0 0 0
1 0 0 0
2 6 1 1
3 9 1 0
4 12 2 1
5 15 3 1
6 18 3 0
7 21 4 1
8 24 4 0
9 27 5 1
10 30 6 1
11 33 6 0
12 36 7 1
13 39 7 0
14 42 8 1
15 45 9 1

可以看到从i=4开始,每次比i-1按照11010的规律增加,和前面从month=3的推导规律是一致的。这月之前(含当月)多3的累计月数为3*(month+1)/5-1:
2*(month-2)+3*(month+1)/5-1
因此:

w = ( day-1 + 2*(month-2)+3*(month+1)/5-1 + year-1 + year/4 - year/100 +year/400)%7

把公式简化一下得到:

w = ( day + 2month +3(month+1)/5 + year + year/4 - year/100 +year/400)%7

参考:https://blog.csdn.net/zjy900507/article/details/80929688
原文是按照o年3月1日推导的,本文是按照1年1月1日推导的。

C语言根据日期计算星期——基姆拉尔森计算公式相关推荐

  1. C语言根据日期(年,月,日)判断星期几(使用基姆拉尔森计算公式)

    C语言根据日期判断星期几(使用基姆拉尔森计算公式) 算法如下:  基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日 ...

  2. C语言根据日期判断星期几(使用基姆拉尔森计算公式)

    C语言根据日期判断星期几(使用基姆拉尔森计算公式) 算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数 ...

  3. 根据日期计算星期几 -- 基姆拉尔森计算公式

    首先看下百度百科的基姆拉尔森计算公式定义:  基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y ...

  4. 基姆拉尔森计算公式(根据日期判断星期几)

    //基姆拉尔森计算公式根据日期判断星期几 void CalculateWeekDay(int y, int m,int d){if(m==1||m==2) m+=12,y--;int iWeek = ...

  5. 算法设计——基姆拉尔森计算公式:计算几月几号是星期几

    基姆拉尔森计算公式 W=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 其中,W表示算出的星期的数字表示:0:星期日:1:星期一-- d表示日期,m表示月份,y表示年份 ...

  6. HDU 6112 今夕何夕【2017百度之星】【日期模拟计算】【基姆拉尔森计算公式】【蔡勒公式】

    今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. 根据日期判断星期几(使用基姆拉尔森计算公式)

    基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公式中有个与其他公式不同的 ...

  8. c语言输入年月日输出星期几,基姆拉尔森计算公式 (根据输入的年月日输出星期几)...

    基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公式中有个与其他公式不同的 ...

  9. 根据年月日计算是星期几的函数,基姆拉尔森计算公式

    算法如下:  基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公式中有个与 ...

最新文章

  1. Java分布式 RPC 框架性能大比拼,Dubbo真的最差吗?
  2. python怎么换行输入而不执行_关于在IDLE中怎么换行继续敲写代码而不执行语句...
  3. android工作注意事项
  4. Kolor Panotour Pro 使用方法
  5. 03.full_text interval查询
  6. mysql与citespace_CiteSpace与MySQL数据库的连接-科学网—博客.PDF
  7. Spring Bean装配
  8. sql中什么时候应用临时表_SQL数据仓库环境中的临时表应用程序
  9. Sublime Text 2 常用插件介绍
  10. 51单片机LCD1602显示
  11. 百度地图 LBS API 使用
  12. android 仿飞猪日历,vue+vux 仿飞猪app火车票部分(四)
  13. NOIp2018停课集训总结
  14. html卡牌游戏代码,查看“宝可梦卡牌游戏DPt系列”的源代码
  15. php 5.3.3 漏洞,PHP 5.3.7版本更新 修复安全漏洞
  16. 计算机 竞赛 甘肃,甘肃省第三届创新杯计算机应用能力大赛获奖名单
  17. 最佳视频转换器:Filmage Converter Mac
  18. Django中间件Middleware
  19. 实验楼Java写计算器_Java版图形界面计算器
  20. AQS排它锁的获取acquire、释放release详解

热门文章

  1. GD32f303 驱动之SPI
  2. 医药公司的绩效管理体系搭建案例
  3. C#_web 项目实战第一步——装操作系统
  4. 常规电参量测量面框式电力仪表大全
  5. 写了一个网站:12小时福利区
  6. 共享服务器文件卷影恢复,Win2008下巧用卷影副本 实现按需恢复
  7. 也许我们不是最优秀的人才,但我们要做最努力的人
  8. 任何一个合数都可以写成几个质数相乘的形式
  9. 深度学习框架TensorFlow系列之(五)优化器1
  10. 查看电脑配置信息方法