C++沈老师的最后一关(日期计算)

题目描述
安杰好不容易搬完了弹药,没想到沈老师还不打算放过他。除非,他能回答沈老师一个问题。这个问题很简单:已知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,分别代表周一到周日

样例输入 Copy
2011 11 11
样例输出 Copy
5

思路就是计算两个日期的总和去相减,为了更加方便,我打开电脑的日期功能,查到2012年1月1日是星期天。

有一个坑点,就是那一段很长的if

#include<bits/stdc++.h>
using namespace std;
int day1[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int day2[15]={0,31,29,31,30,31,30,31,31,30,31,30,31};
bool leap(int year){
    if (year % 400 == 0 || (year % 4 == 0 && (year % 100 != 0)))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
long long  sum1=1,sum2;
void init(){
    for(int i=1599;i<2012;i++){
        if(leap(i))sum1+=366;
        else sum1+=365;
    }
}
int main()
{
    int year,mon,day;
    init();
    while(~scanf("%d%d%d",&year,&mon,&day)){
        sum2=day;
        for(int i=1599;i<year;i++){
            if(leap(i))sum2+=366;
            else sum2+=365;
        }
        for(int i=1;i<mon;i++){
            if(leap(year))sum2+=day2[i];
            else sum2+=day1[i];
        }
         
        int k;
        if(sum2>=sum1){
            k=(sum2-sum1+7)%7;
        }
        else {
            k=abs(sum1-sum2+7)%7;
            if(k==1)k=6;
            else if(k==2)k=5;
            else if(k==3)k=4;
            else if(k==4)k=3;
            else if(k==5)k=2;
            else if(k==6)k=1;
        }
         
        if(k==0)k=7;
        cout<<k<<endl;
    }
    return 0; 
}
发布了10 篇原创文章 · 获赞 1 · 访问量 495

猜你喜欢

转载自blog.csdn.net/xuhang513/article/details/104545829