普通
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; }