题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的,则规定它们之间的天数为两天。
输入格式
有多组数据,每组数据有两行,分别表示两个日期,形式为 YYYYMMDD
输出格式
每组数据输出一行,即日期差值。
样例输入
20130101
20130105
样例输出
5
思路
不妨假设第一个日期早于第二个日期(否则交换即可)。
这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加1天,直到第一个日期等于第二个日期为止,即可统计出答案。具体处理时,如果当加了一天之后天数d等于当前月份m所拥有的天数加1,那么就令月份m加1、同时置天数d为1号(即把日期变为下一个月的1号);如果此时月份m变为了13,那么就令年份y加1、同时置月份m为1月(即把日期变为下一年的1月)。
为了方便直接取出每个月的天数,不妨给定一个二维数组 int month13J2],用来存放每个月的天数,其中第二维为0时表示平年,为1时表示国年。
注意:如果想要加快速度,只需要先把第一个日期的年份不断加1,直到与第二个日期的年份相差1为止(想一想为什么不能直接加到等于第二个日期的年份时才停止?),期间根据平年或是闰年来累加365天或者366天即可。之后再进行不断令天数加1的操作。
#include<cstdio>
//平年和闰年对应每个月的天数
int month[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}};
//判断平闰年
bool isLeap(int year){
return (year%4==0&&year%100!=0)||(year%400==0);
}
int main(){
int time1,y1,m1,d1;
int time2,y2,m2,d2;
while(scanf("%d%d",&time1,&time2)!=EOF){
//比较两个日期的大小,使得第二个日期大于第一个日期
if(time1>time2){
int temp=time1;
time1=time2;
time2=temp;
}
//求得年月日
y1=time1/10000,m1=time1%10000/100,d1=time1%100;
y2=time2/10000,m2=time2%10000/100,d2=time2%100;
int ans=1;
//第一个日期没有达到第二个日期时进行循环
//即!((y1==y2)&&(m1==m2)&&(d1==d2))
while(y1<y2||m1<m2||d1<d2){
d1++;//天数加一
if(d1==month[m1][isLeap(y1)]+1){//满当月天数
m1++; //日期变为下月一号
d1=1;
}
if(m1==13){//月份满足12个月
y1++;//日期变为下一年一月
m1=1;
}
ans++;//累计
}
printf("%d\n",ans);//输出结果
}
return 0;
}
运行结果: