【算法】神奇的O(1)
参考文章:
【CSDN】 Jane_96《算星期几神器——基姆拉尔森计算公式》
【CSDN】Lux_Sun 《ACM模板——日期类》
/**
基姆拉尔森公式和蔡勒公式:
二者都可以快速的计算出日期对应的星期
*/
#include<iostream>
#include<string>
using namespace std;
string week1[] = {"Mon","Tue","Wen","Thu","Fir","Sat","Sun"};
// 基姆拉尔森 1 ·适用 Monday 开头
int kimLarsen1(int y, int m, int d) {
if(m < 3) {
m += 12;
y--;
}
int w = (y + y /4 + y / 400 - y / 100 + 2 * m + 3 * (m + 1)/5 + d) % 7;
return w;
}
string week2[] = {"Sun","Mon","Tue","Wen","Thu","Fir","Sat"};
// 基姆拉尔森公式 2 ·适用 Sunday 开头
int kimLarsen2(int y,int m,int d) {
if(m==1||m==2)
m+=12,y--;
int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
return ++w;
}
// 蔡勒公式 ·适用 Sunday 开头
int zeller(int y,int m,int d) {
if(m==1||m==2)
m+=12,y--;
int c=y/100,ty=y%100;
int w=ty+ty/4+c/4-2*c+26*(m+1)/10+d-1;
return w%7==0?7:(w+7)%7;
}
int main() {
int y,m,d;
// 输入 年 月 日,以空格隔开
while(cin>>y>>m>>d) {
int wkimLarsen1 = kimLarsen1(y, m, d);
int wkimLarsen2 = kimLarsen2(y, m, d);
int wZeller = zeller(y, m, d);
cout<<week1[wkimLarsen1]<<endl;
cout<<week2[wkimLarsen2]<<endl;
cout<<week2[wZeller]<<endl;
}
return 0;
}