[usaco]Friday the Thirteenth题解

来源:互联网 发布:mysql语句区分大小写吗 编辑:程序博客网 时间:2024/05/21 06:29

题目:

输入一个年份n,统计从1900年开始的n年中每个月13号中,周一周二……各有多少个。例如输入20,表示1900到1919二十年240个月的13号中,分别有36 33 34 33 35 35 34 个星期六,星期日,星期一……。

题解:

本体数据不大,故采用模拟日期,即一天一天过去,碰到13号就把对应星期几的数组元素+1 。首先根据年份计算闰年,然后计算某年某月的天数,二月为28+year(y)天。然后在主函数里,日期d变量每次加1,满了当年当月的天数之后回到1,然后月份+1;月份满12之后回到1,同时年份+1;直到年份到1900+n停止。同时星期数不断1到7循环。

代码:

/*
ID: xcwhkh1
LANG: C
TASK: friday
*/
#include <stdio.h>
#include<string.h>
int year(int y)
{
if((y%4==0&&y%100!=0)||y%400==0)
return 1;
else
return 0;
}
int month(int m,int y)
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
return 31;
if(m==4||m==6||m==9||m==11) 
return 30;
if(m==2) 
return 28+year(y);
}
int main () {
    FILE *fin  = fopen ("friday.in", "r");
    FILE *fout = fopen ("friday.out", "w");
int y=1900,m=1,d=1,w=1,n;
int wd[7];
for(int i=0;i<7;i++)
wd[i]=0;
fscanf(fin,"%d",&n);
while(y<1900+n)
{
w++;
if(w==8)
w=1;//计算星期 
d++;
if(d>month(m,y))
{
d=1;
m++;
}
if(m>12)
{
m=1;
y++;
}
if(d==13)
wd[w-1]++;//每逢13号 星期某+1 
}
fprintf(fout,"%d %d %d %d %d %d %d\n",wd[5],wd[6],wd[0],wd[1],wd[2],wd[3],wd[4]);
    return 0;
}
原创粉丝点击