黑色星期五


译 by 孖哥

13号又是星期五是一个不寻常的日子吗?

 

13号在星期五比在其他日少吗?为了回答这个问题,写一个程序来计算在n年里13
日落在星期一,星期二......星期日的次数.这个测试从1900年1月1日到
1900+n-1年12月31日.n是一个非负数且不大于400.

这里有一些你要知道的:

1900年1月1日是星期一.
4,6,11和9月有30天.其他月份除了2月有31天.闰年2月有29天,平年2月有28天.
年份可以被4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年)
以上规则不适合于世纪年.可以被400整除的世纪年为闰年,否则为平年.所以,1700,1800,1900和2100年是平年,而2000年是闰年.

请不要预先算好数据!

PROGRAM NAME: friday

INPUT FORMAT

一个整数n.

SAMPLE INPUT (file friday.in)

20

OUTPUT FORMAT

七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一.....星期五的次数.

SAMPLE OUTPUT (file friday.out)

36 33 34 33 35 35 34


总的来说,由于总共N才是400年,我就是一天一天直接枚举的,都算出来了

#include  " stdlib.h "
#include 
" stdio.h "
int  mon[ 13 ] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 } ;
int  ans[ 8 ] = { 0 } ;
int  n,end;

void  work()
{
    
int  y,m,d;
    
int  i;
    
int  w = 1 ;
    y
= 1900 ;
    end
= y + n - 1 ;
    m
= d = 1 ;
    
while (y != end || m != 12 || d != 31 )
    
{
        
if (d == mon[m] + 1 )
        
{
            d
= 1 ;
            m
++ ;
        }

        
if (m == 13 )
        
{
            y
++ ;
            m
= 1 ;
            
if ((y % 100 && y % 4 == 0 ) || y % 400 == 0 )
            
{
                mon[
2 ] = 29 ;
            }

            
else
                mon[
2 ] = 28 ;
        }

        
if (d == 13 )
            ans[w]
++ ;
        w
++ ;
        w
= (w - 1 ) % 7 + 1 ;
        d
++ ;
    }

    printf(
" %d %d  " ,ans[ 6 ],ans[ 7 ]);
    
for (i = 1 ;i <= 4 ;i ++ )
        printf(
" %d  " ,ans[i]);
    printf(
" %d\n " ,ans[ 5 ]);
}


int  main()
{
    freopen(
" friday.in " , " r " ,stdin);
    freopen(
" friday.out " , " w " ,stdout);
    scanf(
" %d " , & n);
    work();
    exit(
0 );
}