日期差值
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函数中则会出现栈溢出现象,导致程序异常。凡遇到需要大的存储空间的时候,一定要定义为全局变量。或者申请动态数组。
相关文章推荐
- csr8670--button按键的实现
- 扣丁学堂——Bitmaps与优化(处理较大图片,缓存图片)
- Global Azure启用Multi-factor Authentication配置介绍
- ROS学习资料总结
- perl while continue
- Linux学习—xShell连接vmware虚拟机设置Ip
- jquery选择器扩展之样式选择器
- appcan更新
- HDU 2200 Eddy's AC难题(组合数学)
- Centos 6.5源码安装mysql_5.6.17
- linux下history命令的使用小结
- Android API Level与sdk版本对照表
- 说明
- ubuntu如何实现双屏显示
- 关于WIN7 64位安装ADS2014的总结
- docker 安装
- 大数据应用的几个典型例子
- Python 插件安装
- JS 四舍五入
- UIView中的坐标转换