黑色星期五


譯 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 );
}