任给两个日期,格式为年-月-日,算出两个日期相差的天数
描述
给定两个日期,计算相差的天数。比如2010-1-1和2010-1-3相差2天。
输入
共两行:
第一行包含三个整数startYear,startMonth,startDay,分别是起始年、月、日。
第二行包含三个整数endYear,endMonth,endDay,分别是结束年、月、日。
相邻两个整数之间用单个空格隔开。
年份范围在1~3000。保证日期正确且结束日期不早于起始日期。
输出
输出一个整数,即是两个日期相差的天数。
样例输入
2008 1 1
2009 1 1
样例输出
366
一般我们自己在生活中算两个日期的差值都是很小的天数,只知道两个日期就好了,但是到俩个日期相差很大的话就很难直接算出来。
这里我们加入一个时间轴,红色是起始点,蓝色是两个所给的日期,d1是第一个日期到起始点的天数,d2是第二个日期到起始点的天数,用d2-d1就是答案。
怎么算d1,d2呢?
很简单,让你算2000年01月01日到2001年03月31日怎么算?
一般都是先算过了多少整的年份,很明显过了一年,先让d1=356*(2001-2000),加上过的完整的月份的天数,过了两个月1,2,d1=d1+31+28,最后加上日数,d1=d1+31;
如果求2000年01月01到2400年03月31日呢?
可能感觉和上面的差不多,但是如果还是直接让d1=365*(2400-2000)就错了,这样的结果不是过整年的天数,因为我们忽视了平年和闰年的区别。
从2000年到2200中间过了多少闰年?
闰年有2000 2004 2008…2096 2104…2196 2204…2296 2304…2396
如果我们每过4年加一天,那么每过100年我们会多加一天,然后我们每过100减一天,我们每过400年就少一天;
根据上面分析得到
(与2000.1.1的天数)
用所求的年份减去已知条件的年份,1997----已知条件的前面的(闰年年份+1),1901-----(前面的是100的倍数但不是400的年份+1),1601------(前面是400的倍数的年份+1) 加一很关键
d1=(year-2000)*365+(year-1997)/4-(year-1901)/100+(year-1601)/400;
可以自己带入2001,2100,2101,试数就明白涵义了
然后算过的完整的月数
当是3月时,就将一月,二月的天数加上;还要判断这一年是否为闰年,是闰年的话2月为28天,
int yue[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year%4==0 && year%100!=0 || year%400==0) yue[2]=29;
else yue[2]=28;
for(i=0;i<month;i++)
{
d1=yue[i];
}
最后加上日期数就算出到起始的天数了;
d1+=day;
同样通过相同的做法将第二个日期到起始点的天数算出来,然后相减即可。
下面是完整的代码
# include <iostream>
# include <cstring>
# include <cstdio>
struct data
{
int year;//对应年
int month;//对应月
int day;//对应日
};
int main()
{
data start,endd;
std::cin>>start.year>>start.month>>start.day;//输入第一个日期
std::cin>>endd.year>>endd.month>>endd.day;//输入第二个日期
int yue[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//月份对应的天数(例如yue[1]就是一月的天数)
if(start.year%4==0 && start.year%100!=0 || start.year%400==0) yue[2]=29;//如果这一年是闰年,二月有29天;
else yue[2]=28;//不是闰年,二月有28天;
int day,i,day1,ans;//day 是第一个日期到0年0月0日的天数,day1是第二个日期到0年0月0日的天数;
day=start.year*365+(start.year-1)/4-(start.year-1)/100+(start.year-1)/400;//通过累加算出有第一年到0年的年数的天数(例如1年03月01日到0年0月0日的年数是一年,有365天
day+=strat.day;//加上过的天数;
for(i=0;i<start.month;i++)
{
day+=yue[i];//加上过的月数的天数,(例如1年03月01日到0年0月0日的月数是3个月,完整的过了两个月,1月,2月,有0+31+28天;
}
//下面是算第二个日期到0年0月0日的天数
if(endd.year%4==0 && endd.year%100!=0 || endd.year%400==0) yue[2]=29;
else yue[2]=28;
day1=endd.year*365+(endd.year-1)/4-(endd.year-1)/100+(endd.year-1)/400+endd.day;
for(i=0;i<endd.month;i++)
{
day1+=yue[i];
}
ans=day1-day;//天数之差
std::cout<<ans;
return 0;
}
本题来源OpenJudge 1.13.25–计算两个日期的天数,已AC。