首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

星期几有关问题——蔡勒公式

2013-02-18 
星期几问题——蔡勒公式前言这篇博客主要是参考网上的一个帖子,然后自己推断验证,在原创和转载之间犹豫了很

星期几问题——蔡勒公式
前言这篇博客主要是参考网上的一个帖子,然后自己推断验证,在原创和转载之间犹豫了很久,鉴于我确实做了很多推导工作,姑且就认为我是原创吧!
简介星期制度星期制度是一种古老的制度。据说因为《圣经×创世纪》中规定上帝用六天的时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生活,而星期天是休息日。
求星期几的思路


原点差值取余法首先,先要知道在想算的日子之前的一个确定的日子是星期几,拿这一天作为推算的标准,也就是相当于一个计算的“原点”。其次,知道想算的日子和这个确定的日子之间相差了多少天,用7除以这个日期的差值,余数就是想算的日子的星期在确定的日子的星期之后的多少天。如果余数是0,就表示这两天的星期相同。显然,如果把这个作为“原点”的日子选为星期日,那么余数正好就是星期几。
“原点”选取直接计算两个日期之间的天数,还是不免繁琐。比如1982年7月29日和2004年5月1日之间相隔794天,这不是一下子就能计算出来的,它包括了三个时间段:
    1982年7月29日以后这一年的剩余天数1983年-2003年这21个整年的全部天数从2004年1月1日到2004年5月1日的经过的天数
为了简化日期的计算,可以考虑减少第一部分的天数计算,因此考虑可以把原点日期选取为公元前1年12月31日(ps:恰好这天就是周日)。这样的话,第一段时间为0,第二段时间的整年数为想计算日期所在的年数减一(ps:计算多少天注意考虑闰年)。第三段日期正常计算即可。
公历的置闰规则公历的平年是365天,闰年是366天。置闰的方法是能被4整除的年份在2月加一天,但能被100整除的不闰,能被400整除的又闰。符合规则公式可以是(c语言描述):
#include <stdio.h>#include <stdlib.h>#include <string.h>struct date{int day;char month[12];int year;};int strToMonth(char *);void printWeek(int, int, int);int main(){struct date today;int count, m;while(scanf("%d %s %d", &today.day, today.month, &today.year) != EOF){m = strToMonth(today.month);printWeek(today.day, m, today.year);}return 0;}void printWeek(int day, int month, int year){int number, week, i;int m[12] = {31,28,31,30,31,30,31,31,30,31,30,31};if((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)){m[1] = 29;}number = (year - 1)  + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;for(i = 0; i < month - 1; i ++){number += m[i];}number += day;week = number % 7;switch(week){case 0:printf("Sunday\n");break;case 1:printf("Monday\n");break;case 2:printf("Tuesday\n");break;case 3:printf("Wednesday\n");break;case 4:printf("Thursday\n");break;case 5:printf("Friday\n");break;case 6:printf("Saturday\n");break;}}int strToMonth(char *month){if(strcmp(month, "January") == 0){return 1;}else if(strcmp(month, "February") == 0){return 2;}else if(strcmp(month, "March") == 0){return 3;}else if(strcmp(month, "April") == 0){return 4;}else if(strcmp(month, "May") == 0){return 5;}else if(strcmp(month, "June") == 0){return 6;}else if(strcmp(month, "July") == 0){return 7;}else if(strcmp(month, "August") == 0){return 8;}else if(strcmp(month, "September") == 0){return 9;}else if(strcmp(month, "October") == 0){return 10;}else if(strcmp(month, "November") == 0){return 11;}else if(strcmp(month, "December") == 0){return 12;}}


后记其实计算星期几的公式可以继续推导简化,我年前确实时间比较紧张,就不继续推导了,大家可以参考这个论坛的帖子,自己学习,我也是参考上面的理论分析:http://bbs.bccn.net/thread-162951-2-1.html


热点排行