题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的,则规定它们之间的天数为两天。
输入格式
有多组数据,每组数据有两行,分别表示两个日期,形式为 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;
}运行结果:

                










