USACO 1.1.3 Friday The Thirteenth

//译题
//★Friday the Thirteenth 黑色星期五
13 号又是星期五是一个不寻常的日子吗?
13 号在星期五比在其他日少吗?为了回答这个问题,写一个程序来计算在n 年里13
日落在星期一,星期二......星期日的次数.这个测试从1900 年1 月1 日到
1900+n-1 年12 月31 日.n 是一个非负数且不大于400.
这里有一些你要知道的:
1900 年1 月1 日是星期一.
4,6,11 和9 月有30 天.其他月份除了2 月有31 天.闰年2 月有29 天,平年2 月有28 天.
年份可以被4 整除的为闰年(1992=4*498 所以 1992 年是闰年,但是1990 年不是闰年)
以上规则不适合于世纪年.可以被400 整除的世纪年为闰年,否则为平年.所以,1700,1800,19002100 年是平年,而2000 年是闰年.
请不要预先算好数据!
PROGRAM NAME: friday
INPUT FORMAT
一个整数n.
SAMPLE INPUT (file friday.in)
20
OUTPUT FORMAT
七个在一行且相分开的整数,它们代表13 日是星期六,星期日,星期一.....星期五的次数.
SAMPLE OUTPUT (file friday.out)
36 33 34 33 35 35 34
/*
ID: china_l
LANG: C
TASK: friday
*/
#include<stdio.h>
int main()
{
    int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int day[7]={0};                         
    int i,j,n,t=1900,m=6;            
    freopen("friday.in","r",stdin);
    freopen("friday.out","w",stdout);
    
    scanf("%d",&n);
    t+=n;
    for(i=1900;i<t;i++)
    {
        if(i%400 == 0 ||(i%100!=0 && i%4 == 0))    //判断是否是闰年 
            mon[1]=29;                            //是,2月为29天 
        else mon[1]=28;                            //不是,2月为28天 
        
        for(j=0;j<12;j++)                        //然后计算每个月的13号是星期几 
        {                                        //因为1900.1.1是星期一,1900.1.13是星期六,最开始m=6代表的就是1.13号是星期六 
            day[m]++;                            //在数组中对应的星期+1(day[0-6],分别对应星期日,星期一到星期六) 
            m+=mon[j];                            //加上本月的天数,得到下个月13号的天数 
            m%=7;                                //%7,得到下个月的13号对应的是星期几 
        }                                        //因为7%7=0;所以星期天的总天数存放在day[0]中
    }
    printf("%d",day[6]);                    //按照题目意思,先打印星期六 
    for(i=0;i<6;i++)                        //然后打印星期天,星期一到星期五 
        printf(" %d",day[i]);
    printf("
");
    return 0;
}
原文地址:https://www.cnblogs.com/Lee-geeker/p/3222448.html