POJ 3393 Lucky and Good Months by Gregorian Calendar

这是一个讨厌的英文阅读题+讨厌的模拟题。

这真是个锻炼英语阅读和代码实现能力的好题啊!!!

题目大意是这样的:

大致题意:

科普文一篇,文章80%都是无用信息,因为都是常识,但是又不得不看,因为有20%是常人不知道的历史常识。

 

定义:

Good month : 该月第一个工作日为星期一的月份

Luckly month: 该月最后一个工作日为星期五的月份

问: 给定一个Gregorian Calendar格里高公历的 时间闭区间(就是包括端点的年月了)

【开始年、月】~【结束年、月】

     在这个时间区间内,有多少个Goog month,有多少个Luckly month

 

文章要点:

Gregorian Calendar格里高公历 就是现在广泛使用公历(西历),下面简称GC

GC的起始日期为 1年1月1号,该日为星期六

GC平年有365天,闰年366天(2月多1天)

GC有12个月,各月的天数和现在的使用的西历一致

GC在1582年之前(不包括1582),若该年份能被4整除,则为闰年

GC在1582年之后(包括1582),判断闰年的标准(满足下面随便一个):

(1) 能被4整除,但不能被100整除;

(2) 能被400整除。

由于历史原因,GC规定1700年无条件为闰年

由于历史原因,GC规定1752年9月3日~13日共11天不存在,即1752年9月只有19天

GC一星期有7天,排序为Sun,Mon,Tue,Wed,Thu,Fri,Sat,和现在的星期一致,其中Mon到Fri为工作日,Sun和Sat为休息日

 

(感谢大神翻译总结)

下面是代码:

#include <stdio.h>
int month[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int lmonth[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
int leap(int year)
{
    if(year<1582)
    {
        if(year%4)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    else
    {
        if(year==1700)
        {
            return 1;
        }
        if((!(year%4)&&(year%100)) || !(year%400))
        {
            return 1;
        }
    }
    return 0;
}
int Sum_day(int y,int m)
{
    int i,j,day=1;
    for(i=1; i<y; i++)
    {
        if(leap(i))
        {
            day+=366;
        }
        else
        {
            day+=365;
        }
    }
    for(j=1; j<m; j++)
    {
        if(leap(i))
        {
            day+=lmonth[j];
        }
        else
        {
            day+=month[j];
        }
    }
    if(y>1752)
    {
        day-=11;
    }
    else if(y==1752 && m>9)
    {
        day-=11;
    }
    return day;
}
int main()
{
    int w;
    scanf("%d",&w);
    while(w--)
    {
        int ys,ms,ye,me,suml=0,sumg=0,day,i,j,flat;
        scanf("%d%d%d%d",&ys,&ms,&ye,&me);
        day=Sum_day(ys,ms);
       if(day%7>0&&day%7<4)
        {
            sumg++;
        }
        for(i=ys; i<ye; i++)
        {
            flat=0;
            if(leap(i))
            {
                flat=1;
            }
            if(i==ys)
            {
                j=ms;
            }
            else
            {
                j=1;
            }
            if(flat)
            {
                for(; j<=12; j++)
                {
                    day+=lmonth[j];
                    if(i==1752&&j==9)
                    {
                        day-=11;
                    }
                    if(day%7>0&&day%7<4)
                    {
                        suml++;
                        sumg++;
                    }
                }
            }
            else
            {
                for(; j<=12; j++)
                {
                    day+=month[j];
                    if(i==1752&&j==9)
                    {
                        day-=11;
                    }
                    if(day%7>0&&day%7<4)
                    {
                        suml++;
                        sumg++;
                    }
                }
            }
        }
        flat=0;
        if(leap(i))
        {
            flat=1;
        }
        if(i==ys)
        {
            j=ms;
        }
        else
        {
            j=1;
        }
        if(flat)
        {
            for(; j<=me; j++)
            {
                day+=lmonth[j];
                if(i==1752&&j==9)
                {
                    day-=11;
                }
                if(day%7>0&&day%7<4)
                {
                    suml++;
                    if(j!=me)
                    {
                        sumg++;
                    }
                }
            }
        }
        else
        {
            for(; j<=me; j++)
            {
                day+=month[j];
                if(i==1752&&j==9)
                {
                    day-=11;
                }
                if(day%7>0&&day%7<4)
                {
                    suml++;
                    if(j!=me)
                    {
                        sumg++;
                    }
                }
            }
        }
        printf("%d %d\n",suml,sumg);
    }
    return 0;
}


你可能感兴趣的:(poj,刷题)