日期差值

379 阅读2分钟

题目描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入描述:

有多组数据,每组数据有两行,分别表示两个日期,形式为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年开始到指定年份的天数。记得判断是否是闰年。