题目描述: 有两个日期,求两个日期之间的天数,如果两个日期是连续的,则规定他们之间的天数为两天。输入格式:YYYYMMDD
具体思路:不妨假设第一个日期早于第二个日期(否则交换即可)。这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加1天,直到第一个日期等于第二个日期为止,即可统计出答案。具体处理时,如果当加了一天之后天数d等于当前月份m所拥有的天数加1,那么就令月份m加1、同时置天数d为1号(即把日期变为下一个月的1号); 如果此时月份m变为了13,那么就令年份y加1、同时置月份m为1月 (即把日期变为下一年的1月)。
为了方便直接取出每个月的天数,不妨给定一个二维数组int month[13][2],用来存放每个月的天数,其中第二维为0时表示平年,为1时表示闰年。
注意: 如果想要加快速度,只需要先把第一个日期的年份不断加1,直到与第二个日期的年份相差1为止,期间根据平年或是闰年来累加365天或者366天即可。之后再进行不断令天数加1的操作。
#include<stdio.h>
int mouth [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}}; /*初始值为0,{平年,闰年}的区别*/
bool isrun(int year){
return (year%4==0&&year%100!=0)||(year%400==0);}/*判断某年是否为闰年,返回bool值*/
int main(){
int y1,m1,d1;
int y2,m2,d2;
int time1,time2;
while(scanf("%d%d",&time1,&time2)!=EOF){/*输入的值正确,才进行以下操作*/
if(time1>time2){ /*因为计算差值是day+1的方式,则time1必须小于time2*/
int t=time1;
time1=time2;
time2=t;
}
y1=time1/10000,m1=time1%10000/100,d1=time1%100;/*将年月日分开取出来*/
y2=time2/10000,m2=time2%10000/100,d2=time2%100;
int ans=1; /*看题*/
while(!((y1==y2)&&(m1==m2)&&(d1==d2))){
d1++;
if (d1==mouth[m1][isrun(y1)]+1){/*日期满了进一,月份满了进一*/
m1++;
d1=1; }
if (m1==13){y1++;m1=1;}
ans++;
}
printf("%d",ans);
}
return 0;
}