题目描述
安杰好不容易搬完了弹药,没想到沈老师还不打算放过他。除非,他能回答沈老师一个问题。这个问题很简单:已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?
注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
安杰非常愚钝,你能帮助他吗?
输入
输入只有一行
YYYY MM DD
1599 <= YYYY <= 2999
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
输出
输出只有一行
W
1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5
思路
首先由两种情况
一种是在2011 11 11之前
一种是在2011 11 11之后
我们可以根据这天是星期五来设置两个数组
往后{5,6,7,1,2,3,4};
往前{4,3,2,1,7,6,5};
对他们的天数相差mod7然后判断是在2011 11 11之前还是之后就可以得出今天是星期几
代码
#include<bits/stdc++.h>
using namespace std;
int rn(int x){
if((x%4==0&&x%100!=0)||x%400==0)return 1;
return 0;
}
int main(){
int y,m,d;
while(cin>>y>>m>>d){
int s=0;
int yf[14]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int xq[8]={5,6,7,1,2,3,4};
int xqq[8]={4,3,2,1,7,6,5};
if(y<=2011){
if(y==2011&&m>=11){
if(m==12){
s=s+19+d;
cout<<xq[s%7]<<endl;
}else if(d>=11){
s=d-11;
cout<<xq[s%7]<<endl;
}else if(d<11){
s=11-d-1;
cout<<xqq[s%7]<<endl;
}
}else{
for(int i=y;i<2011;i++){
if(rn(i)){
s+=366;
}else{
s+=365;
}
}
if(y==2011){
for(int i=y+1;i<11;i++){
s+=yf[i];
}
s=s+(yf[y]-d);
cout<<xqq[s%7]<<endl;
}else{
s+=315;
if(rn(y)&&m<=2&&d<=29){
yf[2]++;
}
for(int i=1;i<m;i++){
s-=yf[i];
}
s-=(d+1);
if(rn(y)&&m>2)s--;
cout<<xqq[s%7]<<endl;
}
}
}else{
for(int i=2012;i<y;i++){
if(rn(i)){
s+=366;
}else{
s+=365;
}
}
if(m>2&&rn(y)){
yf[2]++;
}
for(int i=1;i<m;i++){
s+=yf[i];
}
s+=d;
s+=50;
cout<<xq[s%7]<<endl;
}
}
return 0;
}