[usaco]Friday the Thirteenth题解

题目:

输入一个年份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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值