九度1096:日期差值

http://ac.jobdu.com/problem.php?pid=1096

很經典的計算任意兩個日期之間的差值。

方法:利用預處理,以空間換時間的方法,計算任意日期與初始日期0年1月1日之間的差值。再講兩差值求差+1即可。本題關鍵在預處理部分

#include<stdio.h>
#define ISYEAR(x) x%100!=0&&x%4==0||x%400==0?1:0
int dayOfMonth[13][2]={
    0,0,
    31,31,
    28,29,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31
};
struct Date{
    int Day;
    int Month;
    int Year;
    void nextDay(){  //計算下一天日期
        Day++;
        if(Day>dayOfMonth[Month][ISYEAR(Year)]){//如果日期超過了當月的最大日期
            Day=1;
            Month++;//進入下一月
            if(Month>12){//月份超過12
                Month=1;
                Year++;//進入下一年
            }
        }
    }
};
 
int buf[5001][13][32];//保持預處理的天數
int Abs(int x){
    return x<0?-x:x;
}
 
int main()
{
    Date tmp;
    int cnt=0;//天數計數
    tmp.Day=1;
    tmp.Month=1;
    tmp.Year=0;//初始化日期類對象爲0年1月1日
    while(tmp.Year!=5001){//日期不超過5000年
        buf[tmp.Year][tmp.Month][tmp.Day]=cnt;//將該日與0年1月1日的天數差保持起來
        tmp.nextDay();//計算下一天日期
        cnt++;
    }
    int d1,m1,y1;
    int d2,m2,y2;
    while(scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF){
        scanf("%4d%2d%2d",&y2,&m2,&d2);
        printf("%d\n",Abs(buf[y2][m2][d2]-buf[y1][m1][d1])+1);
    }
}

發佈了445 篇原創文章 · 獲贊 15 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章