蓝桥杯--算法提高 日期计算

问题描述
  已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
  输入只有一行
  YYYY MM DD
输出格式
  输出只有一行
  W
数据规模和约定
  1599 <= YYYY <= 2999
  1 <= MM <= 12
  1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
  1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5

#include<iostream>
#include<cmath>
using namespace std;
int mouth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int yy,mm,dd;
int day=0,k=0,i;
bool pd(int n)
{
	if((n%4==0&&n%100!=0)||(n%400==0))return true;
	return false;
}

void a()
{
	if(yy==2011)
	{
		if(mm==12)day+=19+dd;
		else day+=dd-11;
	} 
	else
	{
		for(i=2012;i<yy;i++)
		{
			if(pd(i))k++;
		}
		day+=(yy-2011-1)*365+k;		//中间间隔的整年差 
		for(i=1;i<mm;i++)
		{
			day+=mouth[i];
		}
		day+=dd;
		if(pd(yy)&&mm>2)
		day++;
		day+=50;
	}
	int zz=((day)%7+5)%7;
	if(!zz)cout<<7;
	else
	cout<<zz;
}

void b()
{
	if(yy==2011)
	{
		if(mm==11)day+=11-dd;
		else
		{
			for(i=1;i<mm;i++)day+=mouth[i];
			day+=dd;
			day=315-day;
		}
	} 
	else
	{
		for(i=(yy+1);i<2011;i++)
		{
			if(pd(i))k++;
		}
		day+=(2011-yy-1)*365+k;		//中间间隔的整年差 
		for(i=12;i>mm;i--)
		{
			day+=mouth[i];
		}
		day+=mouth[mm]-dd;
		if(pd(yy)&&mm<=2)
		day++;
		day+=315;
	}day=(5-day%7)>0?(5-day%7):-1*(5-day%7);
	if(!day)cout<<7;
	else
	cout<<day;
}

int main()
{
	cin>>yy>>mm>>dd;
	if(yy>2011||(yy==2011&&mm==12)||(yy==2011&&mm==11&&dd>=11))
	a();
	else
	b();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/WILDCHAP_/article/details/107425706