poj 3393 Lucky and Good Months by Gregorian Calendar(模拟)
题目:http://poj.org/problem?id=3393
一道题目挺长的模拟题,参考了网上大神的题解。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 int Month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 8 int Lmonth[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; 9 10 int check(int year) 11 { 12 if(year<1582) 13 { 14 if(year%4==0) 15 return 1; 16 else 17 return 0; 18 } 19 else 20 { 21 if(year%400==0||(year%4==0&&year%100!=0)||year==1700) 22 return 1; 23 else 24 return 0; 25 } 26 } 27 28 int computeday(int year,int month) 29 { 30 int day=1,i,j; 31 for(i=1; i<year; i++) 32 if(check(i)) 33 day+=366; 34 else 35 day+=365; 36 37 for(j=1; j<month; j++) 38 if(check(i)) 39 day+=Lmonth[j]; 40 else 41 day+=Month[j]; 42 43 if(year>1752||(year==1752&&month>9)) 44 day-=11; 45 return day; 46 } 47 48 int main() 49 { 50 int luck,good,t,*x; 51 int ys,ms,ye,me; 52 int day,i,j; 53 cin>>t; 54 while(t--) 55 { 56 luck=0; good=0; 57 cin>>ys>>ms>>ye>>me; 58 day=computeday(ys,ms); 59 if((day+5)%7<=1||(day+5)%7==6) 60 good++; 61 62 for(i=ys; i<ye; i++) 63 { 64 if(check(i)) 65 x=Lmonth; 66 else 67 x=Month; 68 if(i==ys) 69 j=ms; 70 else 71 j=1; 72 for(; j<=12; j++) 73 { 74 day+=*(x+j); 75 if(i==1752&&j==9) 76 day-=11; 77 if((day+5)%7<=1||(day+5)%7==6) 78 { 79 good++; 80 luck++; 81 } 82 } 83 } 84 85 if(check(i)) 86 x=Lmonth; 87 else 88 x=Month; 89 if(i==ys) 90 j=ms; 91 else 92 j=1; 93 for(; j<=me; j++) 94 { 95 day+=*(x+j); 96 if(i==1752&&j==9) 97 day-=11; 98 if((day+5)%7<=1||(day+5)%7==6) 99 { 100 if(j!=me) 101 good++; 102 luck++; 103 } 104 } 105 printf("%d %d\n",luck,good); 106 } 107 return 0; 108 }