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
1 #include <stdio.h> 2 int leap(int y)//判断闰年 3 { 4 if(y%4==0&&y%100!=0 || y%400==0) 5 { 6 return 1;//闰年 7 } 8 else return 0;//平年 9 } 10 int main() 11 { 12 int n; 13 int a[7]={0};//7,1~6 14 int b[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 15 //分别表示平年的1月13日到2月13日要经历的天数,……,12月13日到1月13日经历的天数 16 17 int i,j; 18 int daySum=13%7; 19 int y=1900; 20 a[daySum]++;//1900年1月13日是星期六 21 22 freopen("friday.in","r",stdin); 23 freopen("friday.out","w",stdout);/**/ 24 scanf("%d",&n); 25 for(i=0;i<n;i++) 26 { 27 y=1900+i;//y表示下面要处理的年份 28 for(j=0;j<12;j++) 29 { 30 if(j==1&&leap(y)==1) 31 { 32 daySum=(daySum+b[j]+1)%7; 33 a[daySum]++; 34 } 35 else 36 { 37 daySum=(daySum+b[j])%7; 38 a[daySum]++; 39 } 40 } 41 } 42 a[daySum]--;//这个地方要剪掉一个1是因为上面的循环其实已经计算到了1900+n年的1月13日。但其实题目只要求到1900+n-1年12月31日为止。 43 printf("%d %d",a[6],a[0]);//先输出星期六、星期天 44 for(i=1;i<6;i++) 45 { 46 printf(" %d",a[i]); 47 } 48 printf("\n"); 49 return 0; 50 }