之前计算日期之类的都是很直接的一点一点累加,最近在王道上看见了这种做法,总之,计算日期差值的话,我们可以选择一个基准,然后计算每一个日期相对于这个基准点过去的时间,这样差值的计算就可以统一到一个时间点的差上去了。记录一下。计算日期差值的题目,例如:
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为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;
}