目录
一. 公式概述
基姆拉尔森计算公式用于计算一周内的日期。比如给你年月日,从而计算今天是星期几。假设 d为日,m为月,y为年,则其表达式如下:
Week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1) mod 7, 3<=m<=14
Week的取值范围是0~6,其中0代表星期日,1~6分别代表星期一到星期六。注意在运算时要把1月和2月看为是上一年的13月和14月代入计算!其模板代码如下:
int Date(int y,int m,int d)
{
if(m==1||m==2){//一二月换算
m+=12;
y--;
}
int week = (d + 2*m +3*(m+1)/5 + y + y/4 - y/100 + y/400 + 1)%7;
return week;//其中0~6表示周日、周一到周六
}
二. 例题分析
HDU6112 今夕何夕
接下来最近的哪一年里的同一个日子,和今天的星期数一样?
#include <iostream>
#include <cstring>
#include<cstdio>
using namespace std;
int Date(int y,int m,int d)
{
if(m==1||m==2){
m+=12;
y--;
}
int week = (d + 2*m +3*(m+1)/5 + y + y/4 - y/100 + y/400 + 1)%7;
return week;
}
bool judgeYear(int y)
{
if((y%4==0&&y%100!=0)||y%400==0)
return true;
return false;
}
int main()
{
int T;
scanf("%d",&T);
int year,month,day;
while(T--){
scanf("%d-%d-%d",&year,&month,&day);
int week = Date(year,month,day);
for(int i = year+1;i<10000;i++)//枚举判断
{
if(judgeYear(year)&&month==2&&day==29&&!judgeYear(i))continue;//注意特别判断第一年闰年2月29第二年不存在的情况!
if(week == Date(i,month,day)){
printf("%d\n",i);
break;
}
}
}
return 0;
}