首页 > 代码库 > 九度1096:日期差值

九度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
intdayOfMonth[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
};
structDate{
    intDay;
    intMonth;
    intYear;
    voidnextDay(){  //计算下一天日期
        Day++;
        if(Day>dayOfMonth[Month][ISYEAR(Year)]){//如果日期超过了当月的最大日期
            Day=1;
            Month++;//进入下一月
            if(Month>12){//月份超过12
                Month=1;
                Year++;//进入下一年
            }
        }
    }
};
 
intbuf[5001][13][32];//保持预处理的天数
intAbs(intx){
    returnx<0?-x:x;
}
 
intmain()
{
    Date tmp;
    intcnt=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++;
    }
    intd1,m1,y1;
    intd2,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);
    }
}

九度1096:日期差值