沈老师的最后一关

题目描述

安杰好不容易搬完了弹药,没想到沈老师还不打算放过他。除非,他能回答沈老师一个问题。这个问题很简单:已知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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值