acm.hdu.edu.cn/showproblem.php?pid=6112
【思路】
公式计算即可,注意特判2月29号
Zeller公式里,计算出的week不能直接模7,要保证week是正数
【AC】
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 8 using namespace std; 9 10 bool leap(int y) 11 { 12 if(y%400==0) return true; 13 if(y%4==0&&y%100!=0) return true; 14 return false; 15 } 16 int Zeller(int y,int m,int d) 17 { 18 if(m==1||m==2) 19 { 20 y--; 21 m+=12; 22 } 23 int c=y/100; 24 y-=c*100; 25 int w=y+y/4+c/4-2*c+26*(m+1)/10+d-1; 26 while(w<0) w+=7; 27 w%=7; 28 return w; 29 } 30 int main() 31 { 32 int T; 33 scanf("%d",&T); 34 while(T--) 35 { 36 int y,m,d; 37 scanf("%d-%d-%d",&y,&m,&d); 38 int week=Zeller(y,m,d); 39 while(1) 40 { 41 y++; 42 if(m==2&&d==29) 43 { 44 if(leap(y)&&Zeller(y,m,d)==week) 45 { 46 printf("%d ",y); 47 break; 48 } 49 } 50 else 51 { 52 if(Zeller(y,m,d)==week) 53 { 54 printf("%d ",y); 55 break; 56 } 57 } 58 } 59 } 60 return 0; 61 }