黑色星期五
译 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
);
}