您的位置:首页 > 其它

日期差值

2016-01-23 18:08 232 查看
求两个日期之间的差值
把原区间问题统一到起点确定的区间问题上去。当要求两个特定的日期之间的天数差时,我们只要将他们

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

换取时间。判断瑞年平年。
#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函数中则会出现栈溢出现象,导致程序异常。凡遇到需要大的存储空间的时候,一定要定义为全局变量。或者申请动态数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: