问题描述
已知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;
}