题目描述
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 <stdio.h>
#include <stdlib.h>
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日初写