求日期差值

【codeup 1928】
输入两个日期,求两者相差的天数。(对连续的两天,规定相差2)
样例输入:

20130101
20130105

样例输出:

5

思路:
假设两个日期,第一个比第二个小。让第一个日期不断累加,直到两者相等。
为减少累加次数,先判断年份之差,如果至少相差两年,就让结果先累加365或366(根据平闰年)。
如果年份相差一年以内,再对日期累加,直到两者相等。

用一个二维数组month[13][2]存放每个月的最大天数。第一维表示月份(从1开始),第二维为0表示平年,1表示闰年。
在每次循环中对天数+1。如果天数达到该月的最大天数+1,则将月份+1,天数重置为1。同理,如果月份达到13,则将年份+1,月份重置为1。

代码:

#include <iostream>   
using namespace std;

//判断平闰年
int isLeap(int year)
{
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		return 1;
	else
		return 0;
}

int main()
{
	int date1, date2;    //输入的两个日期
	int y1, m1, d1, y2, m2, d2;
	int result = 1;
	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}
	};
	cin >> date1 >> date2;
	//year1
	y1 = date1 / 10000;
	m1 = date1 % 10000 / 100;
	d1 = date1 % 100;
	//year2
	y2 = date2 / 10000;
	m2 = date2 % 10000 / 100;
	d2 = date2 % 100;
	if (y1 > y2)    //若第一个大则交换
	{
		int temp = y1;
		y1 = y2;
		y2 = temp;
	}
	while ((y2 - y1) > 1)    //年份相差大于1则先对结果整年累加
	{
		if (isLeap(y1) == 0)
			result += 365;
		else
			result += 366;
	}
	while (y1 < y2 || m1 < m2 || d1 < d2)    //累加天数,直到两者相等
	{
		++d1;
		if (d1 == month[m1][isLeap(y1)] +1)
		{
			++m1;
			d1 = 1;
		}
		if (m1 == 13)
		{
			++y1;
			m1 = 1;
		}
		++result;
	}
	cout << "result:" << result;
}
posted @ 2021-01-16 11:16  MorpheusDong  阅读(217)  评论(0编辑  收藏  举报