- 如果第一年的月日<=2. 28,则需判断这一年是否是闰年
- 如果第一年的月日>2.28,则无需判断这一年是否是闰年
- 如果最后一年的月份小于2月份,则需判断这一年是否是闰年
- 如果最后一年的月份大于等于3月份,则无需判断这一年是否是闰年
- 例如2010 1 1-2019 4 1,先计算2010 1 1-2019 1 1的天数d1,在计算2019 1 1-2019 4 1的天数d2,求得天数为:d=d1+d2-1
- 例如2010 4 1-2019 1 1,先计算2010 4 1-2019 4 1的天数d1,在计算2019 1 1-2019 4 1的天数d2,求得天数为:d=d1-d2+1
代码如下:
#include<stdio.h>
int d1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//非闰年天数数组
int d2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年天数数组
int judge(int year)//判断是否是闰年
{
if(year%4==0)
{
if(year%100!=0||year%400==0)
return 1;
else
return 0;
}
else
return 0;
}
int compute(int x1,int y1,int z1,int x2,int y2,int z2)//计算同一年的任意两天差值
{
int day1=0,day2=0,i;
if(judge(x1))
{
for(i=1;i<y1;i++)
day1=day1+d2[i];
}
else
{
for(i=1;i<y1;i++)
day1=day1+d1[i];
}
day1=day1+z1;
if(judge(x2))
{
for(i=1;i<y2;i++)
day2=day2+d2[i];
}
else
{
for(i=1;i<y2;i++)
day2=day2+d1[i];
}
day2=day2+z2;
return day2-day1+1;
}
int compute_year(int x1,int y1,int z1,int x2,int y2,int z2)
//计算第一年某天到最后一年某天的天数
{
int s=0,i;
if(y1<=2&&z1<=28)//若日期<=2.28,则应考虑该年是否为闰年
{
for(i=x1;i<x2;i++)//如第1年为闰年,则应从第1年开始遍历计算天数
{
if(judge(i))//若第i年为闰年,天数+366
s=s+366;
else //若第i年不为闰年,天数+365
s=s+365;
}
}
else //如第1年不为闰年
{
s=s+365;
for(i=x1+1;i<x2;i++)//则应从第2年开始遍历计算天数
{
if(judge(i)) //若第i年为闰年,天数+366
s=s+366;
else //若第i年不为闰年,天数+365
s=s+365;
}
}
return s;
}
int main()
{
int x1,y1,z1,x2,y2,z2,d,y;
while(1) //无终止
{
scanf("%d %d %d %d %d %d",&x1,&y1,&z1,&x2,&y2,&z2);//输入年月日
y=compute_year(x1,y1,z1,x2,y2,z2);
//计算从第1年某日到最后一年某日(2009 9 1-2020 9 1)
if(x1==x2)//如果为同一年
{
d=compute(x1,y1,z1,x2,y2,z2);//则直接计算同年任意两年差值
printf("%d",d); //输出结果
}
else //如果为不同年
{
if(y1<=y2)//如果第一年月份<=最后一年月份
{
d=compute(x1,y1,z1,x2,y2,z2);
printf("%d",d+y-1);
}
else//如果第一年月份>最后一年月份
{
d=compute(x2,y2,z2,x1,y1,z1);
printf("%d",y-d+1);
}
}
printf("\n");
}
return 0;
}