例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题(日期类问题)相关推荐

  1. Piggy-Bank - 九度教程第 102 题

    Piggy-Bank - 九度教程第 102 题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: Before ACM can do anything, a budget mus ...

  2. 不容易系列之一(九度教程第 94 题)

    不容易系列之一(九度教程第 94 题) 时间限制:1 秒 内存限制:128 兆 特殊判题:否 1.题目描述: 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好"一件&q ...

  3. 质因数的个数 - 九度教程第54题

    质因数的个数 - 九度教程第54题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: 求正整数 N(N>1)的质因数的个数. 相同的质因数需要重复计算.如 120=22235 ...

  4. Excel排序 九度教程第4题

    题目链接 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始) ...

  5. 数制转换 九度教程第44题 a进制数转换为b进制数 不同进制之间相互转换

    题目链接 解题思路: 1.将a进制数转换成十进制数: 2.将十进制数转换成b进制数: 3.使用do while 循环,可以确保即使被转换数字是 0 ,程序也能正常工作. AC代码: #include& ...

  6. 【日期类问题】例2.1日期差值

    二 日期类问题 此类问题解题思路: 定一个锚点日期,如0年1月1日,先算出往后多少年内每一日子距离这个锚点的天数,例如要算两个日期间天数时,便可以将两个日期距离锚点日期之间的天数相减,即可得到. 题目 ...

  7. code1928: 日期差值 技巧模拟

    1928: 日期差值 时间限制: 1 Sec 内存限制: 32 MB 题目描述 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天. 输入 有多组数据,每组数据有两行, ...

  8. (C++)设计一个程序能计算一个日期加上若干天后是什么日期and计算日期差值

    输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数. 输出m行,每行按yyyy-mm-dd的个数输出. #include<cstdio>//判断是否是闰年 bool ...

  9. B1928 日期差值

    1 /* 2 题目描述 3 4 有两个日期,求两个日期之间的天数,如果两个日期是连续的,则规定它们之间的天数为两天. 5 输入格式 6 7 有多组数据,每组数据有两行,分别表示两个日期,形式为YYYY ...

  10. 日期处理——日期差值

    题目描述 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天. 输入 有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD 输出 每组数据输出一行,即日 ...

最新文章

  1. Python 基础 - Day 2 Assignment - ShoppingCart 购物车程序
  2. GTX1080 LetNet-5 CPU GPU cuDNN5.1 时间对比
  3. 【手机游戏开发优化篇】详解手游[体积]及[运行内存]的优化篇!
  4. Select-or-Die:灵活的 jQuery 下拉列表插件
  5. 算法_EXCEL中 A表示第一列,B表示第二列...AA表示27列,AB表示28列,问随意一组字母是多少列
  6. 【C/C++】C++运算符优先级
  7. 恋与抽卡模拟器网页_恋与制作人抽卡模拟器-恋与制作人抽卡模拟器软件下载v1.14.1202-k73游戏之家...
  8. MTK6577+Android GPIO
  9. android代码计时,android秒表计时代码
  10. 微信编辑器——构思编辑器教你如何学好图文排版
  11. mysql中日期相减_Excel教程:Excel日期问题的小妙招
  12. 2022.03.21飞扬的小鸟
  13. 分享一个技术知识类电子书网站
  14. 显存不足问题(OOM、RuntimeError: CUDA out of memory)
  15. nvm use 时出现145乱码 ,解决方案如下
  16. 通过Element-Ui上传图片到七牛云Node服务器
  17. 卡尔曼滤波-建立卡尔曼滤波直觉
  18. 矩阵最小二乘法(正规方程化)
  19. 模拟selelct下拉菜单(搜索框简易版)
  20. 远距离无线音视频传输方案,物联网技术应用,无线远距离WiFi通信技术

热门文章

  1. 实用工具,可以生成dal层的相关cs代码
  2. SQL--取得子部门的存储过程
  3. 深度学习caffe:激活函数
  4. 190819每日一句
  5. 数组做函数参数的退化问题
  6. Atitit 信息处理设备与历史与趋势 目录 1. It设备简史与艾提拉觉得常见重要的设备 2 2. 第一部分 IT萌芽期(约公元前4000年至1945年) 2 2.1. 苏美尔人的象形文字(约公元
  7. Atitit mybatis spring整合。读取spring、yml、文件的mysql url 步骤,读取yml,文件,使用ongl定位到url pwd usr 读取mybatis模板配置,
  8. Atitti 摘要算法 散列算法SHA1 和 MD5  crc32 目录 1.1. CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长 1 1.1.1. 数据摘要算
  9. Atitit。团队建设--管理最佳实践--如何留住核心人才,防止人才流失 ??
  10. (转)比特币算法——SHA256算法介绍