Friday the Thirteenth 黑色星期五
描述
13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出N年的 一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.
注意,开始今年是一千九百年,不是1990
这里有一些你要知道的:
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年是闰年.
请不要调用现成的函数
请不要预先算好数据(就是叫不准打表)!
格式
PROGRAM NAME: friday
INPUT FORMAT:
(friday.in)
一个正整数n.
OUTPUT FORMAT:
(friday.out)
七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一...星期五的次数..
SAMPLE INPUT
20
SAMPLE OUTPUT
36 33 34 33 35 35 34
#include <stdio.h>
int leap(int y)//判断闰年
{
if(y%==&&y%!= || y%==)
{
return ;//闰年
}
else return ;//平年
}
int main()
{
int n;
int a[]={};//7,1~6
int b[]={,,,,,,,,,,,};
//分别表示平年的1月13日到2月13日要经历的天数,……,12月13日到1月13日经历的天数 int i,j;
int daySum=%;
int y=;
a[daySum]++;//1900年1月13日是星期六 freopen("friday.in","r",stdin);
freopen("friday.out","w",stdout);/**/
scanf("%d",&n);
for(i=;i<n;i++)
{
y=+i;//y表示下面要处理的年份
for(j=;j<;j++)
{
if(j==&&leap(y)==)
{
daySum=(daySum+b[j]+)%;
a[daySum]++;
}
else
{
daySum=(daySum+b[j])%;
a[daySum]++;
}
}
}
a[daySum]--;//这个地方要剪掉一个1是因为上面的循环其实已经计算到了1900+n年的1月13日。但其实题目只要求到1900+n-1年12月31日为止。
printf("%d %d",a[],a[]);//先输出星期六、星期天
for(i=;i<;i++)
{
printf(" %d",a[i]);
}
printf("\n");
return ;
}