日期差值

求两个日期之间的差值
把原区间问题统一到起点确定的区间问题上去。当要求两个特定的日期之间的天数差时,我们只要将他们


与原点日期的天数差相减,便能得到这两个特定日期之间的天数差(必要时加绝对值)。预处理是用空间


换取时间。判断瑞年平年。
#include "stdio.h"

#define ISYEAR(x) x%100!=0&&x%4==0||x%400==0? 1:0

int dayofMonth[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};

struct Date
{
	int Day;
	int Month;
	int Year;
	void nextDay()//计算下一天的日期
	{
		Day++;
		if(Day>dayofMonth[Month][ISYEAR(Year)])//若日数超过当月最大值
		{
			Day = 1;
			Month++;		//进入下一月
			if(Month>12)	//若月数超过一年
			{
				Month = 1;
				Year++;		//进入下一年
			}
		}
	}
};
int buf[5001][13][32];		//保存预处理的值
int abs(int x)				//求绝对值
{
	return x<0? -x:x;
}

int main()
{
	Date tmp;
	int cnt;	//天数计算
	tmp.Day = 1;
	tmp.Month = 1;
	tmp.Year = 0;//初始化日期类
	while(tmp.Year != 5001)//日期不超过5000年
	{
		buf[tmp.Year][tmp.Month][tmp.Day] = cnt;
		tmp.nextDay();
		cnt++;		//计数器累加,代表与原日期的天数加1

	}
	int y1,m1,d1;
	int y2,m2,d2;
	while(scanf("%4d%2d%2d",&y1,&m1,&d1) != EOF)
	{
		scanf("%4d%2d%2d",&y2,&m2,&d2);		//读入要计算的两个日期
		printf("%d\n",abs(buf[y2][m2][d2] - buf[y1][m1][d1]) + 1);//用预处理的数据计算两日期差值,注意需要对其求绝对值
	}
	return 0;
}


这段代码还有三点值得注意的地方:
1.在保存某个特定日期与原点日期的天数间隔时,用三维数组,用年,月,日作为下标,这便将日期本身与其存储地址联系起来。将数据本身与存储地址联系起来,这是Hash的思想

2.在本题中输入采用了一个技巧。“%4d”来读取八位数的前四位并对相应的年份赋值

3.将buf[5001][13][2]这个占据空间比较大的三维数组定义为全局变量并不是偶然。由于需要大量耗费存储空间,若在main函数中则会出现栈溢出现象,导致程序异常。凡遇到需要大的存储空间的时候,一定要定义为全局变量。或者申请动态数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值