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 }

 

posted @ 2014-01-17 23:05  水门  阅读(195)  评论(0编辑  收藏  举报