计算两个日期差值

点击查看代码
/*
有两个日期,求两个日期之间的天数,如果两个日期连续,则规定它们之间的天数为两天
输入格式:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出格式:
每组数据输出一行,即日期差值
输入样例:
20130101
20130105
输出样例:
5

解题思路:
1、以第1个日期较小为例设计程序,当输入日期第1个较大时交换两者,确保第1个日期较小
2、从第1个日期开始,循环累计天数,当两个日期相等时就能得到日期差值
	当遇到当月天数上限时,天数归1,月份进1,当遇到月份上限时,月份进1,年份加1	
3、创建一个二维数组month[13][2]存放每月天数,第1维表示某月天数,第2维表示平年和闰年,
	如month[1][0]和month[1][1]分别是1月份平年和闰年的天数。month[0][0]不使用

注:
在VS中结束while循环输入的操作方法
1、按ctrl+z,然后按回车。这个步骤重复3次
2、直接关闭调试控制台
*/

#include<cstdio>
#pragma warning(disable:4996) //允许使用scanf和printf

//判断是否为闰年,如果是返回true
bool isLeap(int year) {
	return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int main() {
	int month[13][2] = {
		(0,0),(31,31),(28,29),(31,31),(30,30), //1、2、3、4月平年和闰年天数
		(31,31),(30,30),(31,31),(31,31),	   //5、6、7、8月
		(30,30),(31,31),(30,30),(31,31)		   //9、10、11、12月
	};
	int time1, y1, m1, d1; //time1是第1个日期,y1、m1、d1是年、月、日
	int time2, y2, m2, d2;
	while (scanf("%d%d", &time1, &time2) != EOF) { //读取time1和time2日期
		if (time1 > time2) {	//第1个日期大于第2个,则交换两者
			int temp = time1;
			time1 = time2;
			time2 = temp;
		}
		y1 = time1 / 10000; m1 = time1 % 10000 / 100; d1 = time1 % 100;
		y2 = time2 / 10000; m2 = time2 % 10000 / 100; d2 = time2 % 100;
		int ans = 1; //记录2个日期相差的天数

		//第1个日期没有达到第2个日期时继续循环统计天数
		//即!((y1==y2)&&(m1==m2)&&(d1==d2))
		while (y1 < y2 || m1 < m2 || d1 < d2) {
			d1++; //天数加1
			//当月天数已满,月份进1,天数归1
			if (d1 == month[m1][isLeap(y1)] + 1) {
				m1++;
				d1 = 1;
			}
			//当年月份已满,年份进1,月份归1
			if (m1 == 13) {
				y1++;
				m1 = 1;
			}
			ans++; //2个日期相差的天数加1
		}
		printf("%d\n", ans); //输出相差天数
	}
	return 0;
}

/*
//两个日期相差较大时,先增加第1个日期的年份,根据平年或闰年直接增加365或366天
//直到与第2个日期年份相差1时停止,然后增加天数、月份,直到两者相等
#include<cstdio>
#pragma warning(disable:4996) //允许使用scanf和printf

//判断是否为闰年,如果是返回true
bool isLeap(int year) {
	return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int main() {
	int month[13][2] = {
		{0,0},{31,31},{28,29},{31,31},{30,30}, //1、2、3、4月平年和闰年天数
		{31,31},{30,30},{31,31},{31,31},	   //5、6、7、8月
		{30,30},{31,31},{30,30},{31,31}		   //9、10、11、12月
	};
	int time1, y1, m1, d1; //time1是第1个日期,y1、m1、d1是年、月、日
	int time2, y2, m2, d2;
	while (scanf("%d%d", &time1, &time2)!=EOF) { //读取time1和time2日期
		if (time1 > time2) {	//第1个日期大于第2个,则交换两者
			int temp = time1;
			time1 = time2;
			time2 = temp;
		}
		y1 = time1 / 10000; m1 = time1 % 10000 / 100; d1 = time1 % 100;
		y2 = time2 / 10000; m2 = time2 % 10000 / 100; d2 = time2 % 100;
		int ans = 1; //记录2个日期相差的天数

		//先以年份为单位计算日期差值,当y1来到y2前一年时结束循环(y1=y2-1)
		while (y1 < y2 - 1) {
			if (isLeap(y1)) ans += 366; //y1是闰年,则日期差值加366天
			else ans += 365;			//y1是平年,则日期差值加365天
			y1++; //y1加1进入下一年
		}
		//然后以天数为单位计算日期差值,当两者日期相等时结束循环
		while ((y1 < y2) || (d1 < d2) || (m1 < m2)) {
			d1++;
			//当天数达到当月上限时,月份进1,天数归1
			if (d1 == month[m1][isLeap(y1)] + 1) {
				m1++;
				d1 = 1;
			}
			//当月份达到年份上限时,年份进1,月份归1
			if (m1 == 13) {
				y1++;
				m1 = 1;
			}
			ans++; //日期差值加1
		}
		printf("%d\n", ans);
	}
	return 0;
}	 
*/
posted @ 2022-09-25 12:54  zhaoo_o  阅读(22)  评论(0编辑  收藏  举报