-
题目描述:
-
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
-
输入:
-
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
-
输出:
-
每组数据输出一行,即日期差值
-
样例输入:
-
20110412 20110422
-
样例输出:
-
11
-
#include "stdafx.h" #define ISYEAR(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][ISYEAR(Year)]) { Day=1;Month++; if(Month>12){ Month=1; Year++; } } } }; int buf[50001][13][32]; int Abs(int x){ return x<0?-x:x; } int _tmain() { Date tmp; int cnt=0; tmp.Day=1; tmp.Month=1; tmp.Year=0; //初始化日期类对象为0年1月1日 while (tmp.Year!=5001) { buf[tmp.Year][tmp.Month][tmp.Day]=cnt; //将该日与0年1月1日的天数差保存起来。 tmp.nextDay(); //计算下一天日期 cnt++; //计数器累加,每经过一天计数器即+1,代表与原点日期的间隔又增加一天 } 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[y2][m2][d2]-buf[y1][m1][d1])+1); } return 0; }
-
1、保存每个日期与原点日期的天数差时,使用三维数组,用年月日来表示数组下标,不必寻找其存储地址,是HASH的基本思想。
-
2、%2d形式,读取两位。读取特定位数的技巧。
-
3、将buf[5001][13][32]这个比较费内存的数组定义为全局变量,如若不然,函数栈空间不足以提供如此大的内存,出现栈溢出。涉及此类需要开辟大空间的情况,需要在函数体外定义。