日期差值
思考1:首先日期是闰年还是平年。闰年分为普通闰年(年份是4的倍数但不是100的倍数)和世纪闰年(是四百的倍数)。我们可以写个布尔函数isRun()判断是否为闰年(是闰年则返回1,是平年返回0)。用宏定义也可以。
思考2:创建二维数组。buff[2][13](日期从下标1开始),根据buff[isRun(year)][j]区分闰年和平年。其中buff[0][j]表示平年(j=1,2..12),buff[1][j]表示闰年。
思考3:判断两个日期年份是否相同。然后判断两个日期的月份是否相同。(不同的情况会有不同的代码!!!)
#include<cstdio> using namespace std; //平年为buff[0][j],闰年为buff[1][j] int buff[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; bool isRun(int year){ if(year%400==0 || (year%4==0 && year%100!=0)) return 1; else return 0; } int main() { int a,b; int year1,year2,month1,month2,day1,day2; int ans; while(scanf("%d%d",&a,&b)!=EOF){ ans=0; year1=a/10000; year2=b/10000; month1=a%10000/100; month2=b%10000/100; day1=a%10000%100; day2=b%10000%100; printf("year1:%d month1:%d day1:%d\n",year1,month1,day1); printf("year2:%d month2:%d day2:%d\n",year2,month2,day2); //year~year2之间的天数(不包括year1和year2) for(int i=year1+1;i<=year2-1;i++){ if(isRun(i)) ans+=366; else ans+=365; } //计算year1年和year2年的天数(讨论year1和year2是否相等) if(year1==year2){ //判断是否在同一月 if(month1==month2) ans+=(day2-day1+1); else{ //计算month1和month2之间的天数(不包括month1和month2) for(int i=month1+1;i<=month2-1;i++){ ans+=buff[isRun(i)][i]; } ans+=(buff[isRun(year1)][month1]-day1+1)+day2; } } //不是同一年 else{ for(int i=month1+1;i<=12;i++){ ans+=buff[isRun(year1)][i]; } ans+=buff[isRun(year1)][month1]-day1+1; for(int i=1;i<=month2-1;i++){ ans+=buff[isRun(year2)][i]; } ans+=day2; } printf("日期差:%d\n",ans); } return 0; }
方法二:
设定0年1月1为原点日期,用数组保存每个日期和原点日期的日期差(buf[year][month][day])。计算两个特定的日期差时只需要两个数组值相减然后再加1即可。
采用了空间换时间的思想,用O(1)的时间复杂度将保存的数据取出。
#include<cstdio> #include<algorithm> using namespace std; #define ISYEAP(x) ((x%100!=0 && x%4==0) ||x%400==0)?1:0 //平年为dayOfMonth[0][j],闰年为dayOfMonth[1][j] int dayOfMonth[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; struct Date{ int year; int month; int day; void nextDay(){ day++; if(day>dayOfMonth[ISYEAP(year)][month]){ day=1; //置1 month++; if(month>12){ month=1;//置1 year++; } } } }; int buf[5001][13][32]={0}; //年月日 int main() { Date tmp; //初始化日期0年1月1日 tmp.year=0; tmp.month=1; tmp.day=1; int cnt=0; //日期差 while(tmp.year!=5001){ buf[tmp.year][tmp.month][tmp.day]=cnt; tmp.nextDay(); cnt++; } int y1,m1,d1; int y2,m2,d2; 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; }