题目描述:
有两个日期,求两个日期之间的天数,如果 两个日期是连续的我们规定他们之间的天数为两天。
输入:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD。
输出:
每组数据输出一行,即日期差值。
样例输入:
20110412
20110422
样例输出:
有两个日期,求两个日期之间的天数,如果 两个日期是连续的我们规定他们之间的天数为两天。
输入:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD。
输出:
每组数据输出一行,即日期差值。
样例输入:
20110412
20110422
样例输出:
11
日期类问题是常考的基本题型之一,需要好好关注练习。
本题和代码参考《机试指南》
求两个日期差,或者计算某个特定的日期是那一年的第几天,像这种计算天数差的问题都可以使用下面的解法。
基本的思路就是把给定的年月日日期统一映射为一个起点确定的日期天数差,然后计算两个日期天数差的话,直接相减即可。
体现在代码上就是先预处理,然后再计算。
特别注意如何处理闰年。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <cmath> using namespace std; #define ISYEAP(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 Day; int Month; int Year; void nextDay(){ Day++; if(Day>dayOfMonth[Month][ISYEAP(Year)]){ Day=1; Month++; if(Month>12){ Month=1; Year++; } } } }; int buf[5001][13][32]; void init(){ Date tmp; tmp.Year=0; tmp.Day=1; tmp.Month=1; int cnt=0; while(tmp.Year!=5001){ buf[tmp.Year][tmp.Month][tmp.Day]=cnt; tmp.nextDay(); cnt++; } } int main(){ init(); int d1,m1,y1; int d2,m2,y2; while(scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF){ scanf("%4d%2d%2d",&y2,&m2,&d2); printf("%d\n",abs(buf[y1][m1][d1]-buf[y2][m2][d2])+1); } }