题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
示例
输入
20110412
20110422
输出
11
思路
-
将闰年和非闰年的天数定义在一个数组中,方便后续对年份的天数的加和。
-
将每月的天数定义在一个数组中,方便后续统计月份对应的天数。
-
定义一个判断闰年的方法,到时候直接调用即可。
-
首先输入第一个日期(年份月份天数)y1,m1,d1,之后输入第二个日期y2,m2,d2;先统计m1的天数,再统计m2的天数,记得判断闰年;再统计y1年共经历了多少天,y2年共经历了多少天。(for循环遍历y2,判断是否是闰年,利用数组下标进行加和)
-
判断y1,y2大小,将日期替换,使y1是相对小的日期,y2是大日期。
-
最后将年份对应的天数和月份对应的天数相加,再对两个天数作差,即可得出相差日期。(作差后+1,因为题目规定连续的天数算两天)
具体实现
#include<bits/stdc++.h>
using namespace std;
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 year[2]={365,366};
int isRun(int year){ //判断闰年
if((year%400==0) || (year%4==0)&&(year%100!=0)) return 1;
else return 0;
}
int main(){
int y1,y2,m1,d1,m2,d2;
while(scanf("%4d%2d%2d",&y1,&m1,&d1) != EOF){
scanf("%4d%2d%2d",&y2,&m2,&d2);
//日期 y1 在本年的天数
for(int i=1; i<m1; i++){
int j=isRun(y1);
d1+= month[i][j];
}
//日期 y2 在本年的天数
for(int i=1; i<m2; i++){
int j=isRun(y2);
d2+= month[i][j];
}
//将年份替换,使y1为小的那一年,y2为大的那一年
if(y1>y2){
int temp=y1;
y1=y2;
y2=temp;
}
//计算y1的年数对应的天数
int yd1=0;
for(int i=0; i<y1; i++){
int j=isRun(y1);
yd1+=year[j];
}
//计算y2的年数对应的天数
int yd2=0;
for(int i=0; i<y2; i++){
int j=isRun(y2);
yd2+=year[j];
}
cout<<yd2+d2-yd1-d1+1<<endl;
}
return 0;
}
小结
-
将每月的天数存入数组中,利用数组下标计算从1月份开始到指定月份的天数。同时记得判断是否是闰年。
-
将闰年和非闰年的天数存入数组中,利用数组下标统计从0年开始到指定年份的天数。记得判断是否是闰年。