星期几问题——蔡勒公式
前言这篇博客主要是参考网上的一个帖子,然后自己推断验证,在原创和转载之间犹豫了很久,鉴于我确实做了很多推导工作,姑且就认为我是原创吧!
简介星期制度星期制度是一种古老的制度。据说因为《圣经×创世纪》中规定上帝用六天的时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生活,而星期天是休息日。
求星期几的思路
“原点”选取直接计算两个日期之间的天数,还是不免繁琐。比如1982年7月29日和2004年5月1日之间相隔794天,这不是一下子就能计算出来的,它包括了三个时间段:
- 1982年7月29日以后这一年的剩余天数1983年-2003年这21个整年的全部天数从2004年1月1日到2004年5月1日的经过的天数
公历的置闰规则公历的平年是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