题目描述
1313 号又是一个星期五,那么 1313号在星期五比在其他日子少吗?
为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出 �n 年的一个周期,要求计算 19001900 年 11 月 11 日至 1900+�−11900+n−1 年 1212 月 3131 日中十三号落在周一到周日的次数。
这里有一些你要知道的:
- 19001900 年 11 月 11 日是星期一。
- 4,6,114,6,11 和 99 月有 3030 天,其他月份除了 22 月都有 3131 天,闰年 22 月有 2929 天,平年 22 月有 2828 天。
- 年份可以被 44 整除的为闰年(1992=4×4981992=4×498 所以 19921992 年是闰年,但是 19901990 年不是闰年)。
- 以上规则不适合于世纪年。可以被 400400 整除的世纪年为闰年,否则为平年。所以,1700,1800,1900,21001700,1800,1900,2100 年是平年,而 20002000 年是闰年。
输入格式
一个正整数 �n。
输出格式
依次输出周六、日、一、二、三、四、五在 1313 日出现的次数。
输入输出样例
输入 #1复制
20
输出 #1复制
36 33 34 33 35 35 34
说明/提示
【数据范围】
对于 100%100% 的数据,1≤�≤4001≤n≤400。
题目翻译来自NOCOW。
USACO Training Section 1.1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 1000
typedef struct
{
int a[9];
}Data;
void Init(Data &a)
{
int i = 0;
for (i = 0; i <= 7; i++)
a.a[i] = 0;
}
int judge(int year, int month, int day) //判断某日是某年的第几天
{
int run[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
int ping[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int sum = 0, i;
if ((year % 4 == 0 & year % 100 != 0) || (year % 400 == 0))
{
for (i = 0; i < month - 1; i++)
{
sum += run[i];
}
sum += day;
return sum;
}
else
{
for (i = 0; i < month - 1; i++)
{
sum += ping[i];
}
sum += day;
return sum;
}
}
int Wday(int year) //返回某年的一月一日是周几
{
int sum = 0, n, i, t;
for (i = 1900; i < year; i++)
{
t = judge(i, 12, 31);
sum = t + sum;
}
t = (sum + 1) % 7;
return t;
}
void jisuan(Data &a, int fir, int year)//计算某年的13日,fir为该年1月1日为周几
{
int i, sum, t;
for (i = 1; i <= 12; i++)
{
sum = judge(year, i, 13);
t = (sum - 1) % 7;
switch (t)
{
case 0:a.a[fir%7]++; break;
case 1:a.a[(fir+1)%7]++; break;
case 2:a.a[(fir+2)%7]++; break;
case 3:a.a[(fir+3)%7]++; break;
case 4:a.a[(fir+4)%7]++; break;
case 5:a.a[(fir+5)%7]++; break;
case 6:a.a[(fir+6)%7]++; break;
}
}
}
int main()
{
Data data;
int n, j, day, t;
Init(data);
scanf("%d", &n);
for (j = 0; j < n; j++)
{
t = Wday(1900 + j);
jisuan(data, t, 1900 + j);
}
printf("%d %d %d %d %d %d %d\n", data.a[6], data.a[0], data.a[1], data.a[2], data.a[3], data.a[4], data.a[5]);
return 0;
}