题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出:
每组数据输出一行,即日期差值
样例输入:
20130101
20130105
样例输出:
5
具体分析
step 1,设立数组存放不同性质年份的每个月份的天数;
step 2,编写函数判断某年份是否为闰年,是则返回1,不是则返回0,0表示的平年,1表示的闰年;
step 3,输入两个时间,比较两个时间的大小,保证time1大于time2,否则交换。
step 4,对输入的YYYYMMDD格式日期进行分割,分别给出表示年份,月份和天数的变量y,m,d;
step 5,根据判断闰平年的判断增加年份数的同时增加日期差值直至time1-time2=1
step 6,在第一个日期没能达到第二个日期的时候(即,y1 < y2 || m1 < m2 || d1 < d2的时候)循环将第一个日期不断+1,期间注意月份和年份变化;
step 7,用变量sum(因为两个日期是连续的我们规定他们之间的天数为两天故ans初始值为1)统计循环次数即日期差值并打印输出。
注意 在step5中增加年份来增加日期差值时要注意月份,如果是闰年,月份为1或者2(不是2月29)时才增加366否则为365,2月29日时要增加365并将日期变为28
代码
#include <bits/stdc++.h>
using namespace std;
bool isLeaf(int year){
return(year%4==0&&year%100!=0)||(year%400==0);
}
int main(){
int sum=1;
int time1,time2;
cin>>time1>>time2;
if(time1<time2){ //将较大值赋给time1
int swap=time1;
time1=time2;
time2=swap;
}
int month[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
int year1,year2,month1,month2,day1,day2;
//取出年月日
year1=time1/10000;
year2=time2/10000;
month1=(time1/100)%100;
month2=(time2/100)%100;
day1=time1%100;
day2=time2%100;
//将time2的年份增加到time1-1的年份
while(year1-year2>1){
//判断月份是否为闰年的1、2月份(但不是2.29)
if(isLeaf(year2)){
if(month2==1||month2==2){
if(day2==29&&month2==2){
day2=28;
}
else
sum=sum+1;
}
}
sum=sum+365;
year2++;
}
//逐一增加日期
while(year2<year1||month2<month1||day2<day1){
if(day2==month[month2][isLeaf(year2)]){
day2=1;
month2++;
if(month2==13){
year2++;
month2=1;
}
}
else{
day2++;
}
sum++;
}
cout<<sum<<endl;
return 0;
}