王道机考系列——日期类问题
王道机考系列——日期类问题
日期差值
有两个日期,计算两个日期之间的天数,如果两个日期是连续的,我们规定他们之间的天数为两天。
输入:
有多组输入,每组数据有两行,分别表示两个日期,形式为YYYYMMDD;
输出:
每组数据输出一行,即日期差值。
样例输入:
20110412
20110422
样例输出:
11
解析:将原问题统一到一个确定的起点区间上去,比如0年1月1日,当我们输入日期的时候计算出日期与起点区间的差,当我们计算两个日期的差时只需要将它们与起点区间的差相减就OK了,这个做法可以先计算出每个日期与起点日期之间的差,当我们输入日期的时候在O(1)的时间内可以查出当前日期与起点日期的差,相当于是用空间换取时间的做法。
注意:
闰年的判断条件是:当年数如果不能被100整除但是能被4整除时为闰年或者当年数能被40整除时为闰年
实现的C++程序
#include <stdio.h>
#include <iostream>
#define ISLEAPYEAR(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 year;
int month;
int day;
void NextDay() {
// 计算下一天的日期
day++;
if (day > DayofMonth[month][ISLEAPYEAR(year)]) {
day = 1;
month++;
if (month > 12) {
month = 1;
year++;
}
}
}
};
int buf[5001][13][32]; //保存预处理的天数
int abs(int x) {
return x < 0 ? -x : x;
}
int main() {
Date tmp;
tmp