算法提高 日期计算
时间限制:1.0s 内存限制:256.0MB
问题描述
已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
输入只有一行
YYYY MM DD
YYYY MM DD
输出格式
输出只有一行
W
W
数据规模和约定
1599 <= YYYY <= 2999
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
1 <= W <= 7,分别代表周一到周日
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5
分析:这道题没有什么意思,做的恶心,只要仔细就行,分析
# include <cstdio>
using namespace std;
int main(){
int y,m,d;
int a[16]={0,31,28,31,30,31,30,31,31,30,31,30,31};
scanf("%d%d%d",&y,&m,&d);
int flag = 0;
//2011 11 11
//大于为 1 小于为0
if((y>=2011&&m>=11&&d>=11)||y>2011){
flag = 1;
}else{
flag = 0;
}
int s = 0;
if(flag){
if(y==2011){
if(m==11) s=d-11;
else {
s+=19+d;
}
}else{
if(y>2011) s+=19+31;
for(int i=2012;i<y;i++){
if((i%4==0&&i%100!=0)||i%400==0){
s+=366;
}else{
s+=365;
}
}
if((y%4==0&&y%100!=0)||y%400==0){
a[2] = 29;
for(int i=1;i<m;i++){
s+=a[i];
}
}else{
a[2] = 28;
for(int i=1;i<m;i++){
s+=a[i];
}
}
s+=d;
}
s = s%7;
if(s==1) printf("6\n");
else if(s==2) printf("7\n");
else if(s==0) printf("5\n");
else printf("%d\n",s-2);
/*
3 1
4 2
5 3
6 4
*/
}else{//小的日期
//2011年的处理
if(y==2011){
int t = 0;
for(int i=1;i<m;i++){
t+=a[i];
}
t+=d;
s = 365 - t - 19 - 31;
//printf("%d\n",s);
}else{
for(int i=y+1;i<2011;i++){
if((i%4==0&&i%100!=0)||i%400==0){
s+=366;
}else{
s+=365;
}
}
if((y%4==0&&y%100!=0)||y%400==0){
a[2] = 29;
}else{
a[2] = 28;
}
int t = 0;
for(int i=1;i<m;i++){
t+=a[i];
}
t+=d;
if((y%4==0&&y%100!=0)||y%400==0){
s = s +(366-t+1);
}else{
s = s +(365-t+1);
}
s+=365-31-20;
/*
0 5
1 4
2 3
3 2
4 1
5 7
6 6
*/
}
s=s%7;
if(s==0) printf("5\n");
else if(s==1) printf("4\n");
else if(s==2) printf("3\n");
else if(s==3) printf("2\n");
else if(s==4) printf("1\n");
else if(s==5) printf("7\n");
else if(s==6) printf("6\n");
}
return 0;
}