include
include
/* run this program using the console pauser or add your own getch, system("pause") or input loop /
using namespace std;
//用来判断平年还闰年的函数,平年返回0,闰年返回1;
int is_leapyear(int i){
if(i%100==0){
if(i%400==0){
return 1;//闰年
}
}
else{
if(i%4==0){
return 1;//闰年
}
}
return 0;//平年
}
//返回平闰年相应的天数,如果参数为0,返回365(平年天数),参数为1,返回366(闰年天数)
int num_year(int i){
if(i==0){
return 365;
}
else{
return 366;
}
}
int main(int argc, char* argv) {
int daytab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int sub=1;//记录相差的天数
//
int begin;
int end;
//接收输入的年份
int row;
//标记平闰年
int y1,m1,d1;
int y2,m2,d2;
scanf("%d%d",&begin,&end);
//接受日期
//分离日期****
y1=begin/10000;
y2=end/10000;
m1=(begin-10000y1)/100;
m2=(end-10000y2)/100;
d1=(begin-10000y1-100m1);
d2=(end-10000y2-100m2);
//***
//考虑到输入日期不一定是先输入小日期在数日大日期。 //所以将日期进行判断与调换。小的日期为1,大的为2 if(y1==y2){ if(m1>m2){ int temp1=m1; int temp2=d1; m1=m2; d1=d2; d2=temp2; m2=temp1; } } //同年不同月,根据实际情况调换月和日 if(y1>y2){ int temp3=y1; int temp1=m1; int temp2=d1; m1=m2; d1=d2; y1=y2; y2=temp3; d2=temp2; m2=temp1; } //不同年,根据实际情况调换年月日 //反转日期******** //先算年数,比如20120223-20130511,那么先将整年数相加,如果m1<=2,则加第i年的年数 //如果m1>2则加(i+1)年的年数。由于每一年只有二月有差别。比如20120223-20130511,从 //20120223到20130223,这期间的年数可想成,2012年过了2.24-12.31,2013年过了1.1-2.23,由于 //2012年是闰年,所以,这期间天数为366天(即第i年)。但是20110324-20120324,这期间天数理解 //为,过了2012的1.1-3.24,过了2011年的3.25-12.31。2012年是闰年,2月有29天,故期间为366天 for(int i=y1;i<y2;i++){ if(m1<=2){ sub+=num_year(is_leapyear(i)); } else{ sub+=num_year(is_leapyear(i+1)); } } //把小年份提到了与大年分同年,比如,20120223-20130511,经过上述步骤sub的累加,已经将 //20120223提到了20130223这个日期 row=is_leapyear(y1);//判断平年闰年 //按照上面的步骤算月,显然如果m1<m2,则经过年份提前,还需要sub加上几日才可到达大日期。 //如果m1>m2.则经过年份提前,sub显然多加了几日,需要减去。 //如果m1=m2,则需直接判断d1与d2; //********************************* if(m1==m2){ if(d1>d2){ sub-=(d1-d2); } else{ sub+=(d2-d1); } } //月份相同,直接算d。如果d1>d2,说明sub多加了,需要减去abs(d1-d2) //如果d1<d2,说明sub少加了,需要加上abs(d1-d2) //********************************** //月份不同 else{ //m1<m2,少加了天数 if(m1<m2){ for(int i=m1;i<m2;i++){ sub+=daytab[row][i]; } //与上面加年数思路一样,20120223-20120512,2.23-3.23,期间过了29天(不同点是月份都是加 //第i月) } //如果m1>m2,多加了天数,这里较难想,我们可以理解为,如果小年份经过加年数之后变成 //了20150512,而大年份是20150223,显然多加了,仍然可以从2.23开始算到5.23,只不过这次 //sub是减去每月月数。 if(m1>m2){ for(int i=m2;i<m1;i++){ sub-=daytab[row][i]; } } //********************************** //天数同上,若1>2则加,1<2则减 if(d1>d2){ sub-=abs(d1-d2); } if(d1<d2){ sub+=abs(d1-d2); } } printf("%d\n",sub);
// }
return 0;
}