当前位置:   article > 正文

2022 年蓝桥杯C++ B组试题B:顺子日期_小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在

小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在

 

顺子日期

问题描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456等。顺子日期指的就是在日期的yyyymmdd表示法中,存在任意连续的三位数是一个顺子的日期。例如20220123就是一个顺子日期,因为它出现了一个顺子:123;而20221023则不是一个顺子日期,它一个顺子也没有。小明想知道在整个2022年份中,一共有多少个顺子日期? 运行限制 ·最大运行时间:1s ·最大运行内存:512M

我的答案:

一、信息

  • 题目描述:在日期的 yyyymmdd 格式中,寻找包含至少一个顺子的日期数量,其中顺子为连续的三个数字(如123、456)。
  • 年份:2022,意味着所有日期都以2022开头。
  • 顺子限定:只有"012"和"123"是2022年内可能出现的顺子。

二、分析

  • 有效顺子:由于年份固定为2022,月份和日期的组合必须是合法的。在2022年内,有效顺子只能是"012"和"123",因为其他顺子会导致非法日期(如月份或日期超出合法范围)。
  • 日期范围:需要考虑每个月实际的天数,包括闰年情况下的2月29日。
  • 字符串搜索:将日期转换为字符串格式使得搜索顺子更加直接。

三、算法设计

  1. 枚举:遍历2022年的每个月每一天,生成日期字符串。
  2. 字符串格式:确保月份和日期是两位数,如果不足两位,前面补零。
  3. 顺子检查:在生成的日期字符串中搜索"012"和"123"。
  4. 计数:累加包含顺子的日期数量。

四、代码实现(用C++)

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. // 定义每个月的天数,不考虑闰年情况
  5. int days_in_month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  6. // 将数字转换为两位数的字符串
  7. std::string to_two_digits(int num) {
  8. if(num < 10) return "0" + std::to_string(num);
  9. return std::to_string(num);
  10. }
  11. // 检查字符串中是否包含顺子
  12. bool contains_sequence(const std::string& date) {
  13. return date.find("012") != std::string::npos || date.find("123") != std::string::npos;
  14. }
  15. int main() {
  16. int sequence_dates_count = 0;
  17. for(int month = 1; month <= 12; ++month) {
  18. for(int day = 1; day <= days_in_month[month]; ++day) {
  19. std::string date = "2022" + to_two_digits(month) + to_two_digits(day);
  20. if(contains_sequence(date)) {
  21. ++sequence_dates_count;
  22. }
  23. }
  24. }
  25. std::cout << "顺子日期总数: " << sequence_dates_count << std::endl;
  26. return 0;
  27. }

五、实现代码过程中可能遇到的问题

  • 日期有效性:代码需要正确处理每个月的天数,特别是闰年的2月。
  • 字符串操作:在将整数转换为字符串时,需要确保月份和日期始终为两位数,这可能需要特殊的注意以避免逻辑错误。
  • 性能:虽然2022年的日期不多,但对于扩展到更多年份或更大范围的搜索,需要考虑算法的性能优化。
  • 边界检查:在实现字符串搜索时,需要确保不会因为字符串的边界错误而遗漏顺子的检查。

 


正确答案:

一、信息

  • 年份:2022年,意味着所有日期都以2022开头。
  • 顺子定义:连续的三个数字,例如012, 123等。
  • 日期格式:顺子需要在日期的yyyymmdd表示法中出现。

二、分析

  • 顺子范围限制:由于年份固定为2022,只有"012"和"123"这两个顺子可以出现在有效日期中。其他如"234"或更大的顺子不可能构成一个有效的2022年日期。
  • 日期有效性:不同月份有不同的天数,需要正确处理每月的天数,特别是二月。

三、算法设计

  1. 遍历每个月每天:从1月1日到12月31日,枚举2022年的所有日期。
  2. 日期字符串构造:将年、月、日转换成字符串,并确保月和日为两位数,即不足两位的前面补零。
  3. 顺子检查:检查构造的日期字符串中是否包含"012"或"123"。
  4. 计数顺子日期:对含有顺子的日期进行计数。

四、代码实现(用C++)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int nums[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  4. string To_string(int x) {
  5. string s;
  6. while(x) {
  7. s += x % 10 + '0';
  8. x /= 10;
  9. }
  10. reverse(s.begin(), s.end());
  11. return s;
  12. }
  13. bool check(int year, int month, int day) {
  14. string s = To_string(year);
  15. if(month < 10) s += "0";
  16. s += To_string(month);
  17. if(day < 10) s += "0";
  18. s += To_string(day);
  19. return (s.find("123") != string::npos) || (s.find("012") != string::npos);
  20. }
  21. int main() {
  22. int ans = 0;
  23. for(int month = 1; month <= 12; month++) {
  24. for(int day = 1; day <= nums[month]; day++) {
  25. if(check(2022, month, day)) ans++;
  26. }
  27. }
  28. cout << ans << endl;
  29. return 0;
  30. }

五、实现代码过程中可能遇到的问题

  • 日期转换:将整数日期转换为字符串时,需要确保月份和日期始终是两位数。
  • 字符串搜索:在构造的日期字符串中搜索顺子,需要确保不会错过任何可能的顺子序列。
  • 月份和日期处理:特别是二月的天数,需要根据是否是闰年来决定是28天还是29天,尽管对于2022年来说,这不是必要的。
  • 不熟悉reserve函数的读者可以看看我这篇博客:1.2.6 蓝桥杯常用函数库之其他库函数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/388646
推荐阅读
相关标签
  

闽ICP备14008679号