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;
}

京公网安备 11010502036488号