日期差值

 

思考1:首先日期是闰年还是平年。闰年分为普通闰年(年份是4的倍数但不是100的倍数)和世纪闰年(是四百的倍数)。我们可以写个布尔函数isRun()判断是否为闰年(是闰年则返回1,是平年返回0)。用宏定义也可以。

思考2:创建二维数组。buff[2][13](日期从下标1开始),根据buff[isRun(year)][j]区分闰年和平年。其中buff[0][j]表示平年(j=1,2..12),buff[1][j]表示闰年。

思考3:判断两个日期年份是否相同。然后判断两个日期的月份是否相同。(不同的情况会有不同的代码!!!)

#include<cstdio>
using namespace std;

//平年为buff[0][j],闰年为buff[1][j]
int buff[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
                 {0,31,29,31,30,31,30,31,31,30,31,30,31}};
bool isRun(int year){
    if(year%400==0 || (year%4==0 && year%100!=0))
        return 1;
    else
        return 0;
}

int main()
{
    int a,b;
    int year1,year2,month1,month2,day1,day2;
    int ans;

    while(scanf("%d%d",&a,&b)!=EOF){
        ans=0;
        year1=a/10000;
        year2=b/10000;
        month1=a%10000/100;
        month2=b%10000/100;
        day1=a%10000%100;
        day2=b%10000%100;
        printf("year1:%d month1:%d day1:%d\n",year1,month1,day1);
        printf("year2:%d month2:%d day2:%d\n",year2,month2,day2);

        //year~year2之间的天数(不包括year1和year2)
        for(int i=year1+1;i<=year2-1;i++){
            if(isRun(i))
                ans+=366;
            else
                ans+=365;
        }

        //计算year1年和year2年的天数(讨论year1和year2是否相等)
        if(year1==year2){
            //判断是否在同一月
            if(month1==month2)
                ans+=(day2-day1+1);
            else{
                //计算month1和month2之间的天数(不包括month1和month2)
                for(int i=month1+1;i<=month2-1;i++){
                    ans+=buff[isRun(i)][i];
                }
                ans+=(buff[isRun(year1)][month1]-day1+1)+day2;
            }
        }
        //不是同一年
        else{

            for(int i=month1+1;i<=12;i++){
                ans+=buff[isRun(year1)][i];
            }
            ans+=buff[isRun(year1)][month1]-day1+1;
            for(int i=1;i<=month2-1;i++){
                ans+=buff[isRun(year2)][i];
            }
            ans+=day2;
        }

        printf("日期差:%d\n",ans);
    }
        return 0;
}

 

方法二:

设定0年1月1为原点日期,用数组保存每个日期和原点日期的日期差(buf[year][month][day])。计算两个特定的日期差时只需要两个数组值相减然后再加1即可。

采用了空间换时间的思想,用O(1)的时间复杂度将保存的数据取出。

#include<cstdio>
#include<algorithm>
using namespace std;
#define ISYEAP(x) ((x%100!=0 && x%4==0) ||x%400==0)?1:0

//平年为dayOfMonth[0][j],闰年为dayOfMonth[1][j]
int dayOfMonth[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
                 {0,31,29,31,30,31,30,31,31,30,31,30,31}};

struct Date{
    int year;
    int month;
    int day;
    void nextDay(){
        day++;
        if(day>dayOfMonth[ISYEAP(year)][month]){
            day=1; //置1
            month++;
            if(month>12){
                month=1;//置1
                year++;
            }
        }
    }
};
int buf[5001][13][32]={0}; //年月日
int main()
{
    Date tmp;
    //初始化日期0年1月1日
    tmp.year=0;
    tmp.month=1;
    tmp.day=1;
    int cnt=0;  //日期差
    while(tmp.year!=5001){
        buf[tmp.year][tmp.month][tmp.day]=cnt;
        tmp.nextDay();
        cnt++;
    }
    int y1,m1,d1;
    int y2,m2,d2;
    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);
    }
    return 0;
}

 

posted @ 2020-01-19 17:28  三行代码划江湖  阅读(419)  评论(0编辑  收藏  举报