1145: 周五为13号(C版)

题目描述
13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出N年的一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.
这里有一些你要知道的:
1、1900年1月1日是星期一.
2、4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.
3、年份可以被4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年).
4、以上规则不适合于世纪年。可以被400整除的世纪年为闰年,否则为平年。所以,1700,1800,1900和2100年是平年,而2000年是闰年.
请不要调用现成的函数
请不要预先算好数据(就是叫不准打表)!
输入
一个正整数n.

输出
七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一…星期五的次数.

样例输入
20
样例输出
36 33 34 33 35 35 34
提示
来源


分析:首先,这道题的难度在于怎么求每个月的13号对应的是星期几,或者换一种思路,今天是X号星期Y,那么一个月后的X号是星期几?不用特殊在意X,只是需要找一种规律即可;

代码:

#include 
#include 
int main(){
    int PN[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int RN[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int SHISANHAO[n*12];//有n乘以12个13号;
        int Mondy[7]={0,0,0,0,0,0,0};
        int T=0;//T代表第多少个13号
        SHISANHAO[T]=6;//初始的13号是星期六;
        for(int i=1900;i<=1900+n-1;i++)
        {
            if(i%4==0&&i%100!=0||i%400==0)
            {
                for(int j=0;j<12;j++)
                {   T++;
                    SHISANHAO[T]=(SHISANHAO[T-1]+RN[j])%7;
                    //这一个13号所代表的星期等于这上一个13号所代表的星期加上个月的天数和7取余数;
                    //这里要注意,和7取余以后星期日用0代表;
                }
            }
            else
            {
                for(int j=0;j<12;j++)
                {   T++;
                    SHISANHAO[T]=(SHISANHAO[T-1]+PN[j])%7;//同上

                }
            }
        }
        for(int i=0;i<T;i++)
        {
            Mondy[SHISANHAO[i]]++;//每个13号所代表的星期号
        }
        printf("%d ",Mondy[6]);//先输出星期六
        for(int i=0;i<5;i++)
        {
            printf("%d ",Mondy[i]);//从星期日开始输出一直到星期四;
        }
         printf("%d\n",Mondy[5]);//星期五最后单个输出并换行,此步骤应题而异。
    }

}

2020年2月10日初写

你可能感兴趣的:(c语言,题目)