IT民工
加油!

这道题是要计算从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;
}

 

posted on 2012-01-14 15:03  找回失去的  阅读(167)  评论(0)    收藏  举报