2738 - C . Friday the Thirteenth

通过次数

0

提交次数

0

时间限制 : 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]);
	}
}