计算日期差值

时间:2023-01-09 07:57:22

之前计算日期之类的都是很直接的一点一点累加,最近在王道上看见了这种做法,总之,计算日期差值的话,我们可以选择一个基准,然后计算每一个日期相对于这个基准点过去的时间,这样差值的计算就可以统一到一个时间点的差上去了。记录一下。计算日期差值的题目,例如:

题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
示例1
输入

20110412
20110422
输出

11

代码:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define ISLEAPYEAR(x) x%400==0 || x%4==0&&x%100 ? 1:0 //计算某一年是否是闰年
using namespace std;

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};   //记录不同年份每个月的天数
int sav[5001][13][32];            //使用个三维数组来保存不同时间相对的天数

struct date{                      //日期类 主要用来计算日期的变化
    int year;
    int month;
    int day;
    int nextday(){
        day++;
        if(day > dayofmonth[month][ISLEAPYEAR(year)]){
            day = 1;
            month++;
            if(month>12){
                year++;
                month=1;
            }
        }
    }
};
int abs(int x){
    return x>0?x:-1*x;
}

int main(){
    date d;
    d.year = 0;
    d.month = 1;
    d.day = 1;
    int cnt = 3;
    while(d.year != 5001){                //预处理 先计算好所有的日期
        sav[d.year][d.month][d.day]=cnt;
        d.nextday();
        cnt++;
    }
    int y1,y2;
    int d1,d2;
    int m1, m2;
    while(scanf("%4d%2d%2d",&y1, &m1, &d1)){
        scanf("%4d%2d%2d", &y2, &m2, &d2);
        printf("%d\n", abs(sav[y1][m1][d1] - sav[y2][m2][d2]) + 1);
    }
    return 0;
}