HDU 6112 今夕何夕 “2017百度之星 1005”

这道题主要是解决两个日期直接的日期差,如果两日期的差%7为0则代表是同一个星期日。而解决日期差最麻烦的就是解决2月29的问题。

2月29日的问题有以下几个点要考虑:

一、之后的第一年是不是要经过2月29这一天,如果经过了或者当年不是闰年,到下一年的今天则+365(下一年不是闰年的情况)

二、在之后的每一年如果是闰年则加上366,否则365

三、在判断时(也就是判断是否是最后一年),要判断这年是不是闰年。如果是,那当前的日期是不是超过了2月29,超过了额外加一天判断,没超过直接加365天。

以上细节在代码相关处均有注解,可以结合代码查看,附代码

#include <iostream>
#include <stdio.h>

using namespace std;

bool rn(int n){                                         //判断是不是闰年
    if(n%4==0&&n%100!=0||n%400==0)
        return true;
    else
        return false;
}
int main()
{
    int t;
    cin>>t;
    int y,m,d;
    while(t--){
        int temp=0;
        scanf("%d-%d-%d",&y,&m,&d);
        if(m==2&&d==29){                //特殊情况:输入的是2月29
            for(int i=y+1;;i++){
                if(rn(i)) {
                    temp+=366;
                }else
                    temp+=365;
                if(temp%7==0&&rn(i)){
                    cout<<i<<endl;
                    break;
                }
            }
        }else{
            for(int i=y;;i++){
                if(rn(i)&&i==y&&m>2) {        //判断第一年年需不需要经历的2月29这一天
                    temp=-1;;
                }
                if(rn(i)) {                    //经过闰年的时候多加一天 
                    temp+=366;
                }else
                    temp+=365;
                //cout<<i<<" "<<temp<<" "<<m<<endl;
                if(temp%7==0&&(rn(i+1)==0||m<=2)){      //这里是没有超过2月或者不是闰年,所以最后一年不需要+1
                    cout<<i+1<<endl;
                    break;
                }
                if((temp+1)%7==0&&rn(i+1)&&m>2){            //这里是代表最后一年是闰年并且经历了2月29这一天,天数自然就加一了
                    cout<<i+1<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_38071217/article/details/77162340