深圳幻海软件技术有限公司 欢迎您!

【蓝桥杯冲刺】日期类专题特训

2023-04-26

目录1.日期累加题目描述输入输出代码2.日期差值题目描述输入输出代码3.打印日期题目描述输入输出代码写在最后:1.日期累加题目链接:日期累加题目描述输入1200823100输出2008-05-13代码#include<iostream>usingnamespacestd;//打表intm

目录

1. 日期累加

题目描述

输入

输出

代码

2. 日期差值

题目描述

输入

输出

代码

3. 打印日期

题目描述

输入

输出

代码

写在最后:


1. 日期累加

题目链接:日期累加

题目描述

输入

  1. 1
  2. 2008 2 3 100

输出

2008-05-13

代码

  1. #include <iostream>
  2. using namespace std;
  3. //打表
  4. int month[] = {0, 31, 28, 31, 30, 31, 30, 31 , 31, 30, 31, 30, 31};
  5. //取当月日期
  6. int get_mday(int year, int mon) {
  7. if(mon == 2 && ((year % 4 == 0 && year % 100) || year % 400 == 0)) return month[mon] + 1;
  8. else return month[mon];
  9. }
  10. //具体实现
  11. void plus_day(int& year, int& mon, int& day, int plus) {
  12. day += plus;
  13. while (day > get_mday(year, mon)) {
  14. int mday = get_mday(year, mon);
  15. if(day > mday) {
  16. day -= mday;
  17. mon++;
  18. }
  19. if(mon > 12) {
  20. mon -= 12;
  21. year++;
  22. }
  23. }
  24. }
  25. int main()
  26. {
  27. int n;
  28. cin >> n;
  29. while(n--) {
  30. int year, mon, day, plus;
  31. cin >> year >> mon >> day >> plus;
  32. //将日期加在一起
  33. plus_day(year, mon, day, plus);
  34. printf("%02d-%02d-%02d\n", year, mon, day);
  35. }
  36. return 0;
  37. }

2. 日期差值

题目链接:日期差值

题目描述

输入

  1. 20110412
  2. 20110422

输出

11

代码

  1. #include <iostream>
  2. using namespace std;
  3. //打表
  4. int month[] = {0, 31, 28, 31, 30, 31, 30, 31 , 31, 30, 31, 30, 31};
  5. //判断闰年
  6. bool is_leap(int year) {
  7. if((year % 4 == 0 && year % 100) || year % 400 == 0) return true;
  8. else return false;
  9. }
  10. int main()
  11. {
  12. int n1, n2;
  13. while (cin >> n1 >> n2) {
  14. //保证之后的代码时小的日期减大的日期
  15. if(n1 > n2) swap(n1, n2);
  16. else if(n1 == n2) {
  17. cout << 2 <<endl; //题目要求连续日期算两天
  18. return 0;
  19. }
  20. //取出年月日
  21. int year1 = n1 / 10000, year2 = n2 / 10000;
  22. int mon1 = n1 / 100 % 100, mon2 = n2 / 100 % 100;
  23. int day1 = n1 % 100, day2 = n2 % 100;
  24. int ans = 0;
  25. //年份差了几天
  26. while(year1 != year2) {
  27. if(is_leap(year1)) ans += 366;
  28. else ans += 365;
  29. year1++;
  30. }
  31. //月份差了几天
  32. while(mon1 != mon2) {
  33. if(mon1 < mon2) {
  34. if(mon1 == 2 && is_leap(year1)) ans += month[mon1] + 1;
  35. else ans += month[mon1];
  36. mon1++;
  37. }
  38. else {
  39. if(mon1 == 2 && is_leap(year1)) ans -= month[mon1] + 1;
  40. else ans -= month[mon1];
  41. }
  42. }
  43. //日期差了几天
  44. if(day1 < day2) {
  45. ans += day2 - day1;
  46. }
  47. else {
  48. ans -= day1 - day2;
  49. }
  50. cout << ans + 1 << endl;
  51. }
  52. return 0;
  53. }

3. 打印日期

题目链接:打印日期

题目描述

输入

  1. 2000 3
  2. 2000 31
  3. 2000 40
  4. 2000 60
  5. 2000 61
  6. 2001 60

输出

  1. 2000-01-03
  2. 2000-01-31
  3. 2000-02-09
  4. 2000-02-29
  5. 2000-03-01
  6. 2001-03-01

代码

  1. #include <iostream>
  2. using namespace std;
  3. //打表
  4. int month[] = {0, 31, 28, 31, 30, 31, 30,31, 31, 30, 31, 30, 31};
  5. //求当月日期
  6. int get_mday(int year, int mon) {
  7. if(mon == 2 && ((year % 4 == 0 && year % 100) || year % 400 == 0)) return month[mon] + 1;
  8. else return month[mon];
  9. }
  10. int main()
  11. {
  12. int year, day;
  13. while (cin >> year >> day) {
  14. int mon = 1;
  15. while (day > get_mday(year, mon)) {
  16. day -= get_mday(year, mon);
  17. mon++;
  18. if(mon > 12) {
  19. mon -= 12;
  20. year++;
  21. }
  22. }
  23. printf("%02d-%02d-%02d\n", year, mon, day);
  24. }
  25. return 0;
  26. }

总结:

日期类的题目大同小异,

把日期类的基本思路练熟了,基本上是能够稳拿这一部分的分数的,

如果你的日期类还不熟练,赶快拿上面几道题练一练手吧!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。 

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览45066 人正在系统学习中