[USACO]黑色星期五

题目描述

13 号又是星期五是一个不寻常的日子吗?
13 号在星期五比在其他日少吗?为了回答这个问题,写一个程序来计算在 n 年里 13 日落在星期一,星期二……星期日的次数.这个测试从 1900 年 1 月 1 日到 1900+n-1 年 12 月 31 日.n 是一个非负数且不大于 400.
这里有一些你要知道的:
1900 年 1 月 1 日是星期一.
4,6,11 和 9 月有 30 天.其他月份除了 2 月有 31 天.闰年 2 月有 29 天,平年 2 月有 28 天.
年份可以被 4 整除的为闰年(1992=4*498 所以 1992 年是闰年,但是 1990 年不是闰年)
以上规则不适合于世纪年.可以被 400 整除的世纪年为闰年,否则为平年.所以,1700,1800,1900 和 2100 年是平年,而 2000 年是闰年.
请不要预先算好数据!

输入

一个整数 n.

输出

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

样例输入
20

#include <stdio.h>
int judgeyear(int n);//计算一年多少天
int main()
{  
 	int b[13]={0,31,60,91,121,152,182,213,244,274,305,335};
	int a[13]={0,31,59,90,120,151,181,212,243,273,304,334};//只用存放11个月的天数,进行累加天数
	int c[8]={0};
	int n,i,j,k,sum=0,threeteen;
	scanf("%d",&n);
	for(i=1900;i<1900+n;i++)
	{
			
		if(judgeyear(i)==366)
		for(j=0;j<=11;j++)
		{
			threeteen=(13+b[j]+sum)%7;//这里的threeteen指的是算出来的星期1至7
			c[threeteen]++;	
		}
		else
		for(j=0;j<=11;j++)
		{
			threeteen=(13+a[j]+sum)%7;
			c[threeteen]++;	
		}
		sum=sum+judgeyear(i);	
	}
	printf("%d %d ",c[6],c[0]);
	for(k=1;k<=5;k++)
	{
		if(k<5)
	printf("%d ",c[k]);
	else
	printf("%d",c[k]);
	}
	
		
}
int judgeyear(int i)
{
	if(i%400==0||(i%100!=0&&i%4==0))
	return 366;
	else
	return 365;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值