牛客网HDU1308

现在使用的历法是从罗马人演变而来的。凯撒编纂了一个日历系统,后来被称为儒略历。在这个系统中,除了4月、6月、9月和11月,所有月份都有31天,其中有30天,2月,在非闰年有28天,闰年有29天。同样,在这个系统中,闰年每四年发生一次。这是因为古罗马的天文学家计算出一年的长度是365.25天,所以每隔四年,就需要增加一天,以使日历与季节保持一致。为了做到这一点,他们在每年增加一天(2月29日),这是4的倍数。

朱利安规则:

每年4的倍数就是闰年,也就是说有额外的一天(2月29日)。

1582年,教皇格里高利的天文学家注意到这一年不是365.25天,而是更接近365.2425。因此,闰年规则将修订如下:

格雷戈里规则:

每年4的倍数就是闰年,除非是100的倍数而不是400的倍数。

为了弥补季节在那之前的变化,日历实际上改变了10天:1582年10月4日之后的第二天被宣布为10月15日。

英国及其帝国(包括美国)直到1752年才改用公历,即9月2日之后的第二天被宣布为9月14日。(推迟的原因是亨利八世和教皇之间的不良关系。)

编写一个程序,使用时间日历转换美国的日期并输出工作日。


也就是说在1752年9月2日以后,第二天成为了9月14日

而1582年的10月15日不用关心

也就是分为两个阶段1752年9月2日以前,1752年9月14日以后

AC代码:

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
string c[7]={"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"};
string a[12]={"January", "February", "March", "April","May", "June", "July", "August","September", "October", "November", "December"};
int b[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int demo(int m,int d,int y)
{
	int sum_y=365*(y-1);
	int sum_m=0;
	for(int i=0;i<m-1;i++)
		sum_m+=b[i];
	int sum=sum_y+sum_m+d;
	return sum;
}
int main()
{
	//freopen("1.txt","r",stdin);
	//freopen("3.txt","w",stdout);
	int m,d,y;
	while(1)
	{
		cin>>m>>d>>y;
		if(m==d&&d==y&&y==0)
			break;
		b[1]=28;
		int sum;
		int add;
		int day;
		bool pend=true;
		if(y==1752&&m==9&&d>2&&d<14)
			pend=false;
		else{
		if(y==1752&&m==9&&d<=2||y==1752&&m<9||y<1752)
		{
			if(y%4==0)
				b[1]=29;
			if(y <= 0 || m > 12 || m < 1 || d < 1 ||d>b[m-1])
				pend=false;
			else
			{
				sum=demo(m,d,y);
				add=((y-1)/4+5)%7;
				sum+=add;
			}
		}
		
		else
		{
			if(y%4==0&&y%100!=0||y%400==0)
				b[1]=29;
			if(y <= 0 || m > 12 || m < 1 || d < 1 ||d>b[m-1])
				pend=false;
			else
			{
				sum=demo(m,d,y);
				add=(y-1)/4-(y-1)/100+(y-1)/400;
				sum+=add;
			}
		}
		day=sum%7;
		}
		if(pend)
		cout<<a[m-1]<<" "<<d<<", "<<y<<" is a "<<c[day]<<endl;
		else
			cout<<m<<"/"<<d<<"/"<<y<<" is an invalid date."<<endl;

	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值