刷题笔记no.1 日期处理

题目来源【codeup 1928】

题目描述

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

输入格式

        有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD。

输出格式

        每组数据输出一行,即日期差值。

样例输入

        20130101

        20130105

样例输出

        5

思路分析

        1.直接读入两个数据year1,year2无法表示年月日关系,因此将两个日期使用%和/分割成两组年(y1y2)月(m1m2)日(d1d2)进行处理。

        2.核心思路是通过增加天数d1使得两个年月日相同,如果year1>year2需要先交换再分割。

        3.存储各月的天数可以使用一维数组,但考虑到平年闰年2月天数不同,不妨定义一个二维数组,前一维1与0代表是否为闰年,后一维把下标为0的位置腾出,从下标1至下标12分别表示各月的天数。

        4.d1超出该月max天数的时候重置为1,并且让m1+1,m1超过12的时候重置为1,并且让y1+1

        5.使用bool类型自定义函数判断闰年与否,并将返回值赋给二维数组第一维,0表示平年,1表示闰年。

代码实现:

        

#include <stdio.h>

int month[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31} };  //定义二维数组存储平年和闰年各月天数

bool is_Leap(int year) //判断是否为闰年
{
	return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
int main()
{
	int year1, year2;
	while (scanf("%d%d", &year1, &year2) != EOF)
	{
		if (year1 > year2)
		{
			int temp = year1;
			year1 = year2;
			year2 = temp;
		}

		int y1, y2, m1, m2, d1, d2;
		y1 = year1 / 10000;
		y2 = year2 / 10000;
		d1 = year1 % 100;
		d2 = year2 % 100;
		m1 = year1 / 100 % 100;
		m2 = year2 / 100 % 100;

		int ans = 1; //两个日期为同一天算1天,因此ans从1开始累加
		//如果两天不是同一天,进入循环,通过d1++来使得两个日期相同

		while ((y1 != y2) || (m1 != m2) || (d1 != d2)) //只有两组ymd完全相同才结束循环
		{
			d1++;
			if (d1 == month[is_Leap(y1)][m1] + 1) //超过对应月份最大天数,月份进1,天数重置
			{
				d1 = 1;
				m1++;
			}
			if (m1 > 12) //超过一年最大月份数,月份重置
			{
				y1++;
				m1 = 1;
			}
			ans++;
		}
		printf("%d\n", ans);
	}

	return 0;
}

   优化方案:

        直接通过增加y1向y2逼近,同时天数+365or366,到y1与y2相差1的时候继续采用增加天数逼近year2。(若直接加到y1 == y2,m1与d1可能>m2与d2导致错误)

参考代码

        

#include <stdio.h>
int month[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31} };
bool is_Leap(int year)
{
	return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
int main()
{
	int year1, year2;
	while (scanf("%d%d", &year1, &year2) != EOF)
	{
		if (year1 > year2)
		{
			int temp = year1;
			year1 = year2;
			year2 = temp;
		}
		int y1, y2, m1, m2, d1, d2;
		y1 = year1 / 10000;
		y2 = year2 / 10000;
		d1 = year1 % 100;
		d2 = year2 % 100;
		m1 = year1 / 100 % 100;
		m2 = year2 / 100 % 100;
		int ans = 1;
		
		while (y1 < y2-1)
		{
			if (is_Leap(y1) == 1) ans += 366;
			else ans += 365;
			y1++;
		}
		
		while (y1 < y2 ||m1 < m2 || d1 < d2)
		{
			d1++;
			if (d1 == month[is_Leap(y1)][m1] + 1)
			{
				d1 = 1;
				m1++;
			}
			if (m1 > 12)
			{
				y1++;
				m1 = 1;
			}
			ans++;
		}
		printf("%d\n", ans);
	}
	return 0;
}

   


 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~THE END~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值