2738 - C . Friday the Thirteenth
时间限制 : 1 秒
内存限制 : 128 MB
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年是闰年.
请不要调用现成的函数
请不要预先算好数据(就是叫不准打表)!
题目输入
多组测试数据。
每组测试数据包括一个正整数n.
题目输出
七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一...星期五的次数..
输入/输出样例
输入格式
20
输出格式
36 33 34 33 35 35 34
C语言解答
#include<stdio.h> int main() { int n,week,c,y,i,j; while(scanf("%d",&n)!=EOF) { int a[8]={0}; for(i=0;i<n;i++) { if(i==n-1) { c=(1900+i)/100; y=1900+i-c*100; for(j=3;j<=12;j++) { week=(c/4)-2*c+(y+y/4)+(13*(j+1)/5)+12; while(week<0){week+=7;} week%=7; switch(week) { case 0:a[7]++;break; case 1:a[1]++;break; case 2:a[2]++;break; case 3:a[3]++;break; case 4:a[4]++;break; case 5:a[5]++;break; case 6:a[6]++;break; } } } else { c=(1900+i)/100; y=1900+i-c*100; for(j=3;j<=14;j++) { week=(c/4)-2*c+(y+y/4)+(13*(j+1)/5)+12; while(week<0){ week+=7; } week%=7; switch(week) { case 0:a[7]++;break; case 1:a[1]++;break; case 2:a[2]++;break; case 3:a[3]++;break; case 4:a[4]++;break; case 5:a[5]++;break; case 6:a[6]++;break; } } } } a[6]+=1; a[2]+=1; printf("%d %d %d %d %d %d %d\n",a[6],a[7],a[1],a[2],a[3],a[4],a[5]); } }
C++解答
/* ID:wangzhe30 LANG:C PROG:friday */ #include <stdio.h> int main() { //freopen("friday.in","r",stdin); //freopen("friday.out","w",stdout); int n; while(scanf("%d",&n)!=EOF) { int year,month2=0,m,dat; int day[7]={0},month[13]={0,0,0,0,0,0,0,0,0,0,0,0,0}; month[1]=1; for (year=0;year<n;year++) { if(!((1900+year)%400)||!((1900+year)%4)&&((1900+year)%100)) month2=1; else month2=0; for (m=1;m<=13;m++) { if(m==1||m==3||m==5||m==7||m==8||m==10) { dat=(month[m]+5)%7; day[dat]++; month[m+1]=(month[m]+3)%7; } if(m==2) { dat=(month[m]+5)%7; day[dat]++; month[3]=(month[2]+month2)%7; } if(m==12) { dat=(month[m]+5)%7; day[dat]++; month[1]=(month[12]+3)%7; } if(m==4||m==6||m==9||m==11) { dat=(month[m]+5)%7; day[dat]++; month[m+1]=(month[m]+2)%7; } } } printf("%d %d %d %d %d %d %d\n",day[6],day[0],day[1],day[2],day[3],day[4],day[5]); } }