这道题是要计算从1900 到 1900 + N – 1年间的每个月的13号是星期五的频率,
实际要求输出的是一个星期中每天出现的次数。首先确定的是平年还是闰年,然后
用两个数组存储平年和闰年的每月的天数。明确一点就是从当前月到下一个的13号
之间的天数就是当前月的天数,先确定上次13号是星期几,再加上当月的天数mod 7
得到的就是下一次13号是星期几, 星期天则得到的数字是0,例如第一次1月13号是
星期6,然后加上31对7 取余,得到下次是星期二。注意一点:到1900+N-1年时的
最后一个月就不要加了,因为再加就是下一年了。最后循环求出结果即可。
/*
ID:yucept21
LANG:C++
TASK:friday
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
int a[7];
int month1[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int month2[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isleap( int n)
{
if( n % 400 == 0 || n % 4 == 0 && n % 100 != 0 )
return true;
return false;
}
int main()
{
freopen( "friday.in", "r", stdin);
freopen( "friday.out", "w", stdout);
memset( a, 0, sizeof a);
int N, ans = 0;
scanf( "%d", &N);
a[6] = 1;
int cnt = 6;
for( int i = 1900; i < 1900 + N ; i ++)
{
bool flag = isleap( i);
if( flag) {
for( int j = 0; j < 12; j ++)
{
if( j == 11 && i == 1900 + N - 1) break;
cnt = (month2[j] + cnt) % 7 ;
a[cnt] ++;
}
}
else {
for( int j = 0; j < 12; j ++)
{
if( j == 11 && i == 1900 + N - 1) break;
cnt = (month1[j] + cnt) % 7 ;
a[cnt] ++;
}
}
}
printf( "%d ", a[6]);
for( int i = 0; i < 5; i ++)
printf( "%d ", a[i]);
printf( "%d\n", a[5]);
return 0;
}
浙公网安备 33010602011771号