USACO/friday

Friday the Thirteenth 黑色星期五

描述

13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出N年的 一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.

注意,开始今年是一千九百年,不是1990

这里有一些你要知道的:

1、1900年1月1日是星期一.

2、4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.

3、年份可以被4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年).

4、以上规则不适合于世纪年。可以被400整除的世纪年为闰年,否则为平年。所以,1700,1800,1900和2100年是平年,而2000年是闰年.

请不要调用现成的函数

请不要预先算好数据(就是叫不准打表)!

格式

PROGRAM NAME: friday

INPUT FORMAT:

(friday.in)

一个正整数n.

OUTPUT FORMAT:

(friday.out)

七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一...星期五的次数..

SAMPLE INPUT

20

SAMPLE OUTPUT

36 33 34 33 35 35 34
 1 #include <stdio.h>
 2 int leap(int y)//判断闰年 
 3 {
 4     if(y%4==0&&y%100!=0 || y%400==0)
 5     {
 6         return 1;//闰年 
 7     }
 8     else return 0;//平年 
 9 }
10 int main()
11 {
12     int n;
13     int a[7]={0};//7,1~6
14     int b[12]={31,28,31,30,31,30,31,31,30,31,30,31};
15     //分别表示平年的1月13日到2月13日要经历的天数,……,12月13日到1月13日经历的天数 
16     
17     int i,j;
18     int daySum=13%7;
19     int y=1900;
20     a[daySum]++;//1900年1月13日是星期六 
21     
22     freopen("friday.in","r",stdin);
23     freopen("friday.out","w",stdout);/**/
24     scanf("%d",&n);
25     for(i=0;i<n;i++)
26     {
27         y=1900+i;//y表示下面要处理的年份 
28         for(j=0;j<12;j++)
29         {
30             if(j==1&&leap(y)==1)
31             {
32                 daySum=(daySum+b[j]+1)%7;
33                 a[daySum]++;
34             }
35             else 
36             {
37                 daySum=(daySum+b[j])%7;
38                 a[daySum]++;
39             }
40         }
41     }
42     a[daySum]--;//这个地方要剪掉一个1是因为上面的循环其实已经计算到了1900+n年的1月13日。但其实题目只要求到1900+n-1年12月31日为止。 
43     printf("%d %d",a[6],a[0]);//先输出星期六、星期天 
44     for(i=1;i<6;i++)
45     {
46         printf(" %d",a[i]);
47     }
48     printf("\n");
49     return 0;
50 }
View Code

 

转载于:https://www.cnblogs.com/huashanqingzhu/p/4175850.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值