例2.3 日期差值 - 九度教程第6题(日期类问题)
例2.3 日期差值(九度教程第6题)
题目
时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述:
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出:
每组数据输出一行,即日期差值
样例输入:
20110412
20110422
样例输出:
11
来源:
2009年上海交通大学计算机研究生机试真题
解析:
该例题考察了日期类问题中最基本的问题:求两个日期间的天数差。
解决这类区间问题有一个统一的思想:把原区间问题统一到起点确定的区间问题上去。这样做有一个巨大的好处:预处理,可以在程序真正开始处理输入数据之前,预处理出所有日期与原点日期的天数差并保存起来。
所以统一设一个原点时间:如0000年1月1日。当要求两个特定日期的天数差时,只要将它们与原点日期的天数差相减,便能得到这两个特定日期之间的天数差(必要时加绝对值)。
还需注意:闰年。
注:
1,定义了一个类,可以用来表示日期,还可以自动计算出下一个日期。
2,为了判断该年是否为闰年,定义了一个宏。
3,保存某特定日期与原点日期的天数差时,使用了三维数组,用年、月、日分别表示该数组下标。这将日期本身与其存储地址联系了起来,只需直接利用它的年月日数字即可找到保存的值。(将数据本身与数据存储地址联系起来,这是Hash的思想,也是Hash的一种基本方式。)
4,输入采用了某种技巧。使用%4d来读取该八位数的前四位并赋值给代表年的变量。 利用在%d之间插入数字来读取特定位数的数字的技巧,值得去采用。
5,将buf[5001][13][32]这个相对比较耗费内存的数组定义为全局变量,是有原因的。 由于需要耗费大量内存,若在main函数中定义该数组,该函数所使用的栈空间不足以提供如此庞大的内存,出现栈溢出,导致程序异常终止。
因此,今后凡是涉及此类需要开辟大量内存空间的情况,必须在函数main体外定意,即定义为全局变量。或者在函数中使用malloc等函数动态申请变量空间。
大致思路:
自定义结构体Date、自定义一个时间原点(0年1月1日)、预存每月的天数(二月作特殊处理),预处理出所有日期与原点日期的天数差,保存在一个三维数组buf[][][]中。
输入要计算的两个日期,求对应两个buf[][][]值的绝对值即可。
代码:
#include<stdio.h>//定义宏判断是否为闰年,方便计算每月天数
#define IsYeap(x) x%4==0 && x%100!=0 || x%400==0 ?1:0int 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][IsYeap(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=0; //天数计数tmp.day=1;tmp.month=1;tmp.year=0; //初始化日期类对象为0年1月1日while(tmp.year!=5001){//日期不超过5000年buf[tmp.year][tmp.month][tmp.day]=cnt; //将该日与0年1月1日的天数差保存起来tmp.nextDay(); //计算下一天日期cnt++; //计数器累加代表与原点日期的间隔又增加一天}int d1,m1,y1;int d2,m2,y2;while(scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF){scanf("%4d%2d%2d",&y2,&m2,&d2);//读入要计算的两个日期printf("%d\n",Abs(buf[y1][m1][d1]-buf[y2][m2][d2])+1);}return 0;
}
例2.3 日期差值 - 九度教程第6题(日期类问题)相关推荐
- Piggy-Bank - 九度教程第 102 题
Piggy-Bank - 九度教程第 102 题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: Before ACM can do anything, a budget mus ...
- 不容易系列之一(九度教程第 94 题)
不容易系列之一(九度教程第 94 题) 时间限制:1 秒 内存限制:128 兆 特殊判题:否 1.题目描述: 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好"一件&q ...
- 质因数的个数 - 九度教程第54题
质因数的个数 - 九度教程第54题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: 求正整数 N(N>1)的质因数的个数. 相同的质因数需要重复计算.如 120=22235 ...
- Excel排序 九度教程第4题
题目链接 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始) ...
- 数制转换 九度教程第44题 a进制数转换为b进制数 不同进制之间相互转换
题目链接 解题思路: 1.将a进制数转换成十进制数: 2.将十进制数转换成b进制数: 3.使用do while 循环,可以确保即使被转换数字是 0 ,程序也能正常工作. AC代码: #include& ...
- 【日期类问题】例2.1日期差值
二 日期类问题 此类问题解题思路: 定一个锚点日期,如0年1月1日,先算出往后多少年内每一日子距离这个锚点的天数,例如要算两个日期间天数时,便可以将两个日期距离锚点日期之间的天数相减,即可得到. 题目 ...
- code1928: 日期差值 技巧模拟
1928: 日期差值 时间限制: 1 Sec 内存限制: 32 MB 题目描述 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天. 输入 有多组数据,每组数据有两行, ...
- (C++)设计一个程序能计算一个日期加上若干天后是什么日期and计算日期差值
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数. 输出m行,每行按yyyy-mm-dd的个数输出. #include<cstdio>//判断是否是闰年 bool ...
- B1928 日期差值
1 /* 2 题目描述 3 4 有两个日期,求两个日期之间的天数,如果两个日期是连续的,则规定它们之间的天数为两天. 5 输入格式 6 7 有多组数据,每组数据有两行,分别表示两个日期,形式为YYYY ...
- 日期处理——日期差值
题目描述 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天. 输入 有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD 输出 每组数据输出一行,即日 ...
最新文章
- Python 基础 - Day 2 Assignment - ShoppingCart 购物车程序
- GTX1080 LetNet-5 CPU GPU cuDNN5.1 时间对比
- 【手机游戏开发优化篇】详解手游[体积]及[运行内存]的优化篇!
- Select-or-Die:灵活的 jQuery 下拉列表插件
- 算法_EXCEL中 A表示第一列,B表示第二列...AA表示27列,AB表示28列,问随意一组字母是多少列
- 【C/C++】C++运算符优先级
- 恋与抽卡模拟器网页_恋与制作人抽卡模拟器-恋与制作人抽卡模拟器软件下载v1.14.1202-k73游戏之家...
- MTK6577+Android GPIO
- android代码计时,android秒表计时代码
- 微信编辑器——构思编辑器教你如何学好图文排版
- mysql中日期相减_Excel教程:Excel日期问题的小妙招
- 2022.03.21飞扬的小鸟
- 分享一个技术知识类电子书网站
- 显存不足问题(OOM、RuntimeError: CUDA out of memory)
- nvm use 时出现145乱码 ,解决方案如下
- 通过Element-Ui上传图片到七牛云Node服务器
- 卡尔曼滤波-建立卡尔曼滤波直觉
- 矩阵最小二乘法(正规方程化)
- 模拟selelct下拉菜单(搜索框简易版)
- 远距离无线音视频传输方案,物联网技术应用,无线远距离WiFi通信技术
热门文章
- 实用工具,可以生成dal层的相关cs代码
- SQL--取得子部门的存储过程
- 深度学习caffe:激活函数
- 190819每日一句
- 数组做函数参数的退化问题
- Atitit 信息处理设备与历史与趋势 目录 1. It设备简史与艾提拉觉得常见重要的设备	2 2. 第一部分 IT萌芽期(约公元前4000年至1945年)	2 2.1. 苏美尔人的象形文字(约公元
- Atitit mybatis spring整合。读取spring、yml、文件的mysql url 步骤,读取yml,文件,使用ongl定位到url pwd usr 读取mybatis模板配置,
- Atitti 摘要算法 散列算法SHA1 和 MD5 crc32 目录 1.1. CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长	1 1.1.1. 数据摘要算
- Atitit。团队建设--管理最佳实践--如何留住核心人才,防止人才流失 ??
- (转)比特币算法——SHA256算法介绍