25:计算两个日期之间的天数【2019信科练习A】
-
总时间限制:
1000ms
-
内存限制:
65536kB
-
描述
给定两个日期,计算相差的天数。比如2010-1-1和2010-1-3相差2天。
-
输入
共两行: 第一行包含三个整数startYear,startMonth,startDay,分别是起始年、月、日。 第二行包含三个整数endYear,endMonth,endDay,分别是结束年、月、日。 相邻两个整数之间用单个空格隔开。 年份范围在1~3000。保证日期正确且结束日期不早于起始日期。
-
输出
输出一个整数,即是两个日期相差的天数。
-
样例输入
2008 1 1 2009 1 1
-
样例输出
366
-
提示
闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。闰年的2月份有29天。
题解
- 以开始年的第一天为起点,计算两个日期的天数,差值为所求
- 一个组件:平/闰年m月d日是该年的第几天(1月1日是第一天)
bool isleap(int y)
{
return y%400==0 || (y%100 && y%4==0);
}
int mdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int get_days_m_d(int m,int d,bool is_leap)
{
int day=0;
for(int i=1; i<m; ++i){
day+=mdays[i];
}
if(is_leap && m>2){
++day;
}
return day+d;
}
int main()
{
int y1,m1,d1;
int y2,m2,d2;
cin>>y1>>m1>>d1>>y2>>m2>>d2;
int day1=get_days_m_d(m1,d1,isleap(y1));
int day2=get_days_m_d(m2,d2,isleap(y2));
//and [y1,y2) days
day2+=(y2-y1)*365;
for(int y=y1; y<y2; ++y){
if(isleap(y)){
++day2;
}
}
cout<<day2-day1<<endl;
return 0;
}