[USACO][Section 1.1][模拟] Friday the Thirteenth

题目大意:

给出一个非负整数n。从1900年1月1日到1900+n-1年12月31日的这段时间里,某年某月13日可能为星期一至星期日的任何一种情况,求出星期一到星期日在规定时间内符合上述条件的数量,并输出。

思路:

简单模拟,思路见注释。

代码:

/*
ID: lujunda
PROG: friday
LANG: C++
*/
#include
#include
#include
using namespace std;
//total_days[i]表示到从1900年1月1日到1900+i年1月1日所需要的天数;week[i%7]表示星期i的数量;
int total_days[401],week[7];
//若leap[i]==true,则该1900+i年为闰年;
//若month[i]==true,则第i月为大月;
bool leap[401],month[13]={true,true,false,true,false,true,false,true,true,false,true,false,true};
//判断公历n年是否为闰年。若是闰年,返回true,否则返回false;
bool check_leap(int n)
{
    if((n%100&&n%4==0)||(n%400==0))
        return true;
    return false;
}
//初始化total_days,和leap数组;
void restore()
{
    int sum=0;
    for(int i=0;i<=400;i++)
    {
        leap[i]=check_leap(i+1900)?true:false;
        if(i)
            sum+=leap[i-1]?366:365;
        total_days[i]=sum;
    }
}
//计算第1900+n年1月1日到12月31日之间的星期一到星期日的数量,并将结果对应加到week数组上。
void cal(int n)
{
    int sum=total_days[n];
    //遍历12个月
    for(int i=1;i<=12;i++)
    {
        //i月13日
        week[(sum+13)%7]++;
        if(month[i])
            sum+=31;
        else if(i==2&&leap[n])
            sum+=29;
        else if(i==2)
            sum+=28;
        else
            sum+=30;
    }
}
int main()
{
    freopen("friday.in","r",stdin);
    freopen("friday.out","w",stdout);
    restore();
    int n;
    while(cin>>n)
    {
        memset(week,0,sizeof(week));
        //遍历每一年
        for(int i=0;i	

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注