题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入
20130101
20130105
样例输出
5
一开始是用算法笔记上的方法,结果发现时间超了
#include<stdio.h>
#include<stdbool.h>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/1000,m1=time1%1000/100,d1=time1%100;y2=time2/1000,m2=time2%1000/100,d2=time2%100;int ans=1;while(y1<y2||m1<m2||d1<d2){d1++;if(d1==month[m1][isLeap(y1)]+1){m1++;d1=1;}if(m1==13){y1++;m1=1;}ans++;}printf("%d\n",ans);}
}
然后,根据书上的提示按年份加可以减少时间,弄了半天,不但没过,代码也乱得不能看。而且这种方法有点绕,后面已经想的糊涂了。只能换个方法了,我用的方法就是以输入的小的年份的第一天为起点分别算出到两个日期的总天数,最后相减。因为连续两天算作差两天,所以最后再加一。
总结,虽说我的方法一定程序上多了重复计算的部分,但却将逻辑理得清清楚楚,方便了我本人计算。
上代码
#include<stdio.h>
//#include<stdbool.h>//如果用C就去掉注释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;int y3=y1,m3=1,d3=1,sum1=0,sum2=0;for(m3;m3<m1;m3++)sum1+=month[m3][isLeap(y3)];sum1+=d1-d3;//printf("y3=%d y1=%d y2=%d\n",y3,y1,y2);for(y3=y1;y3<y2;y3++){if(isLeap(y3))sum2+=366;elsesum2+=365;}//printf("第一发%d\n",sum2);//y3=y1;for(m3=1;m3<m2;m3++){sum2+=month[m3][isLeap(y3)];// printf("%d\n",sum2);}sum2+=d2-d3;/*while(y1<y2||m1<m2||d1<d2){d1++;if(d1==month[m1][isLeap(y1)]+1){m1++;d1=1;}if(m1==13){y1++;m1=1;}ans++;}*///printf("%d%d\n",sum1,sum2);printf("%d\n",sum2-sum1+1);}
}