题目分析:
- 日期的表示:一共8位数,年应该为time/10000,日为time%100,月份为time%10000-time%100
- 排列大小,大的为 time1,小的为time2
- 日期相差,先将年月单独看,月份用不断增加到年月相等,同时建立一个数组记录每月天数,最后日期再用相减,日期相减+1再加上前面的天数为最终天数
- 做一个判断闰年的函数,是闰年为1,不是为0
代码实现
#include <stdio.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} }; isleap(int year){ return(year%4==0&&year%100!=0)||(year%400==0); } int main(){ int temp,time1,time2,y1,y2,m1,m2,d1,d2,days=0; while(scanf("%d%d",&time1,&time2)!=EOF){ if(time1<time2){ //输入两个一组的时间,并排列大小 temp=time2; time2=time1; time1=temp; } d1=time1%100; d2=time2%100; y1=time1/10000; y2=time2/10000; m1=time1%10000/100; m2=time2%10000/100; while(y1!=y2||m1!=m2){ days+=month[m2][isleap(y2)]; //假设每月都从1号开始,先算月份相差的日期 if(++m2>12){ m2=1; y2++; } } days=days+d1-d2+1; //月份相差日期加上号数相差为总相差 printf("%d\n",days); days=0; } return 0; }
要点记录
>while(scanf("%d%d",&time1,&time2)!=EOF)
EOF :End Of File的缩写,通常在文本的最后存在此字符表示资料结束,普遍地说,它是ASCII码中的替换字符(Control-Z,代码26),所以上述代码正常输入完毕后,换行输入 Ctrl+Z ,再输入Enter结束循环。
有一个问题不知道如何解释:输入时这样输入
20181222 20200515Ctrl+Z
会出现正确结果不断打印输出的情况