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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章