普通hash解法:
#include <stdio.h>
#include<algorithm>
#include<string.h>
#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0
char month[13][20]={"","January","February","March","April","May","June","July","August","September","October","November","December"};
char Weekday[7][20]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int dayofMonth[13][2]={0,0,31,31,28,29,31,31,30,30,31,31,30,30,31,31,31,31,30,30,31,31,30,30,31,31};
struct Date{
int Year;
int Mon;
int Day;
void nextDate(){
Day++;
if(Day>dayofMonth[Mon][ISYEAP(Year)]){
Mon++;
Day=1;
if(Mon>12){
Year++;
Mon=1;
}
}
}
};
int buf[3001][13][32];
int main()
{
struct Date Ori;
Ori.Year=0;
Ori.Mon=1;
Ori.Day=1;
int cnt=1;
buf[Ori.Year][Ori.Mon][Ori.Day]=cnt;
while(Ori.Year<3001){//提前将每个日期对应到同一条数轴上去
cnt++;
Ori.nextDate();
buf[Ori.Year][Ori.Mon][Ori.Day]=cnt;
}
int d,y,m;
char s[20];
while(scanf("%d %s %d",&d,&s,&y)!=EOF){
for(m=1;m<=12;m++){
if(strcmp(s,month[m])==0)
break;
}
int days=buf[y][m][d]-buf[2012][7][16];
days+=1;
puts(Weekday[(days%7+7)%7]);
}
return 0;
}
Zeller公式解法:
#include <stdio.h>
#include<algorithm>
#include<string.h>
#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0
char month[13][20]={"","January","February","March","April","May","June","July","August","September","October","November","December"};
char Weekday[7][20]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int main(){
int y,m,d,w;
char s[20];
while(scanf("%d %s %d",&d,&s,&y)!=EOF){
for(m=1;m<13;m++){
if(strcmp(s,month[m])==0)
break;
}
int c=y/100;
if(y<=1582&&m<=10&&d<=4||y<1582){
y=y%100;
w=y+y/4+c/4-2*c+13*(m+1)/5+d+2;
}
else{
y=y%100;
w=y+y/4+c/4-2*c+26*(m+1)/10+d-1;
w=(w%7+7)%7;
}
puts(Weekday[w]);
}
return 0;
}