【USACO题库】1.1.3 Friday the Thirteenth 黑色星期五

题目描述

每月 13 号刚好落在星期五的情况,是不是一定比落在其他星期一~星期四,还有落在周末的这些情况少呢?为了回答这个问题,写一个程序来计算在连续的 n 年中,每月的 13 日落在星期一,星期二……星期日的次数。具体时间段从 1900 年 1 月 1 日到 1900+n-1 年 12 月 31 日。其中 n 是一个非负数且不大于 400。

需要注意的是:

  • 1900 年 1 月 1 日是星期一。
  • 4, 6, 9 和 11 月有 30 天,其他月份(除了 2 月)有 31 天。闰年 2 月有 29 天,平年 2 月有 28 天。
  • 年份可以被 4 整除的为闰年(比如,1992=4×498 所以 1992 年是闰年,但 1990 年不是闰年)。
  • 以上规则不适用于世纪年(即数字刚好为整百的年)。可以被 400 整除的世纪年为闰年,否则为平年。所以,1700,1800,1900 和 2100 年是平年,而 2000 年是闰年。

请不要调用程序语言提供的任何日期相关的内置函数。也请不要预先算好所有答案。

输入

从文件 friday.in 中读入数据。

一个整数 n。

输出

输出到文件 friday.out 中。

一行 7 个整数,代表 13 日是星期六,星期日,星期一……星期五的次数。

样例数据
输入 #1 复制
20
输出 #1 复制
36 33 34 33 35 35 34
提示

13 号星期五(又称黑色星期五,与黑色星期五购物日子不同,后者为感恩节后的第一个礼拜五)是指公历一个月份的第十三天恰好是星期五。在西方文化中,13 日星期五被认为是不幸的一天。在公历中,每年至少会有一次是某一个月的第 13 日正好是星期五,在同一年最多可发生三次。在日耳曼语族和罗曼语族国家的文化当中,十三号星期五被迷信者认为是不幸、不吉利的日子。在许多其他的文化当中也可见到类似的迷信,例如在希腊的文化也视“13 号星期五”为不吉利的一天。(来自维基百科)

#include <stdio.h>
#include <time.h>

int Getmouth(int year,int mouth)
{
	const int ARR[] =
	{
		0,31,28,31,30,31,30,31,31,30,31,30,31
	};
	
	if(mouth==2 && ((year%4==0&&year%100!=0) || year%400==0))
	    return 29;
	return ARR[mouth];
}
/*
星期天是0,
其他是按照顺序的 
*/
int Mouth_Count[13]={0};
int main()
{
	//freopen("friday.in","r",stdin);
	//freopen("friday.out","w",stdout);
    int n,day=13%7;
    scanf("%d",&n);
    Mouth_Count[day]++;
    
    for(int year=1900;year<=1900+n-1;year++)
    {
        for(int mouth=1;mouth<=12;mouth++)
		{
			if(year==1900+n-1&&mouth==12) continue;
			day+=Getmouth(year,mouth),day%=7;
		    Mouth_Count[day]++;	
		}	
	}
	printf("%d %d",Mouth_Count[6],Mouth_Count[0]);
	for(int i=1;i<=5;i++)
	{
		printf(" %d",Mouth_Count[i]);
	}
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值