蓝桥杯C/C++程序设计——日期统计

问题描述

小蓝现在有一个长度为 100100 的数组,数组中的每个元素的值都在 00 到 99 的范围之内。数组中的元素从左至右如下所示:

现在他想要从这个数组中寻找一些满足以下条件的子序列:

  1. 子序列的长度为 88;
  2. 这个子序列可以按照下标顺序组成一个 yyyymmdd 格式的日期,并且要求这个日期是 2023 年中的某一天的日期,例如 20230902,20231223。yyyy 表示年份,mm表示月份,dd表示天数,当月份或者天数的长度只有一位时需要一个前导零补充。

请你帮小蓝计算下按上述条件一共能找到多少个不同的 2023 年的日期。对于相同的日期你只需要统计一次即可。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

运行限制

语言最大运行时间最大运行内存
C++1s256M
C1s256M
Java2s256M
Python33s256M
PyPy33s256M
Go3s256M
JavaScript3s256M

总通过次数: 640  |  总提交次数: 836  |  通过率: 76.6%

难度: 简单   标签: 2023, 暴力, 枚举, 省赛

解题步骤

首先我们观察题目,对题目进行分析,我们要寻找的日期的检索,需要对日期进行遍历循环,然后在一一比较寻找,同时在计数

#include<iostream> // 包含输入输出流库
using namespace std; // 使用标准命名空间

int main() // 主函数入口
{
   // 定义日期数组a,包含41个元素
   int a[41]={3,8,5,1,6,3,4,6,7,0,7,8,2,7,6,8,9,5,6,5,6,1,4,0,1,0,0,9,4,8,0,9,1,2,8,5,0,2,5,3,3};
   int moth,day; // 定义月份和日期变量
   int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; // 定义每个月份的天数
   int sum=0; // 连续出现四位数字的次数累积和

   // 外层循环遍历每个月份
   for(int moth=1;moth<=12;moth++)
   {
      // 内层循环遍历每个月份的每一天
      for(int day=1;day<=month[moth];day++)
      {
            int days[4]; // 定义包含4个整型元素的数组,用于存储日期的四位数字

            if(moth<10) // 如果月份小于10
            {
              days[0]=0; // 数组的第一个元素为0
              days[1]=moth; // 数组的第二个元素为当前月份
            }
            else // 如果月份大于等于10
            {
              days[0]=1; // 数组的第一个元素为1
              days[1]=moth%10; // 数组的第二个元素为月份的个位数
            }
            
            if(day<10) // 如果日期小于10
            {
              days[2]=0; // 数组的第三个元素为0
              days[3]=day; // 数组的第四个元素为当前日期
            }
            else // 如果日期大于等于10
            {
              days[2]=day/10; // 数组的第三个元素为日期的十位数
              days[3]=day%10; // 数组的第四个元素为日期的个位数
            }
            
            int k=0; // 记录已匹配的数字个数
            // 遍历日期数组a
            for(int i=0;i<41;i++)
            {
                // 检查是否与日期的四位数字连续匹配
                if(days[k]==a[i])
                {
                  k++; // 如果匹配成功,则k加1
                }
                // 如果已连续匹配四位数字,则累积和加1并跳出循环
                if(k==4)
                {
                  sum++; // 累积和加1
                  break; // 跳出循环
                }
            }
      }
   }

   // 输出四位数字连续出现的总次数
   cout<<sum;
   return 0; // 返回执行成功
}

 

  

  1. 定义一个长度为41的整型数组a,存储了一组日期。
  2. 定义整型变量moth、day和sum,分别用来表示月份、日期和连续出现次数的累积和。
  3. 定义整型数组month,存储了每个月份的天数。
  4. 使用嵌套的for循环,遍历每个月份的每一天。
  5. 对于每一天,使用一个长度为4的整型数组days,用来存储该日期的四位数字表示。
  6. 将月份和日期的十位和个位数字分别存储到days数组中。
  7. 使用一个变量k来记录当前已经匹配到的数字个数,初始值为0。
  8. 遍历数组a,与days中的数字进行逐一比较。
  9. 如果当前数字与days中对应位置的数字相等,则将k加1。
  10. 如果k等于4,表示连续的四个数字都已经匹配成功,此时将sum加1,并跳出循环。
  11. 最后输出sum的值,即日期数组a中连续出现四位数字的次数。

 

#include<iostream> // 包含输入输出流库
using namespace std; // 使用标准命名空间

int main() // 主函数入口
{
   // 定义日期数组a,包含41个元素
   int a[41]={3,8,5,1,6,3,4,6,7,0,7,8,2,7,6,8,9,5,6,5,6,1,4,0,1,0,0,9,4,8,0,9,1,2,8,5,0,2,5,3,3};
   int moth,day; // 定义月份和日期变量
   int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; // 定义每个月份的天数
   int sum=0; // 连续出现四位数字的次数累积和

上面这部分是代码的开头,包括了头文件的引入、命名空间的声明以及主函数的开始。还定义了日期数组a、月份和日期变量、每个月份的天数和连续出现四位数字的次数累积和。

   // 外层循环遍历每个月份
   for(int moth=1;moth<=12;moth++)
   {
      // 内层循环遍历每个月份的每一天
      for(int day=1;day<=month[moth];day++)
      {
            int days[4]; // 定义包含4个整型元素的数组,用于存储日期的四位数字

这里是外层和内层的两个for循环,用来遍历每个月份的每一天。在内层循环里定义了一个包含4个整型元素的数组days,用于存储日期的四位数字。

            if(moth<10) // 如果月份小于10
            {
              days[0]=0; // 数组的第一个元素为0
              days[1]=moth; // 数组的第二个元素为当前月份
            }
            else // 如果月份大于等于10
            {
              days[0]=1; // 数组的第一个元素为1
              days[1]=moth%10; // 数组的第二个元素为月份的个位数
            }
            
            if(day<10) // 如果日期小于10
            {
              days[2]=0; // 数组的第三个元素为0
              days[3]=day; // 数组的第四个元素为当前日期
            }
            else // 如果日期大于等于10
            {
              days[2]=day/10; // 数组的第三个元素为日期的十位数
              days[3]=day%10; // 数组的第四个元素为日期的个位数
            }

这部分对日期数组的处理,根据月份和日期的大小进行判断,将月份和日期的十位和个位数字分别存储到数组days中。

            int k=0; // 记录已匹配的数字个数
            // 遍历日期数组a
            for(int i=0;i<41;i++)
            {
                // 检查是否与日期的四位数字连续匹配
                if(days[k]==a[i])
                {
                  k++; // 如果匹配成功,则k加1
                }
                // 如果已连续匹配四位数字,则累积和加1并跳出循环
                if(k==4)
                {
                  sum++; // 累积和加1
                  break; // 跳出循环
                }
            }
      }
   }

这里是具体的计算逻辑,通过一个嵌套循环遍历日期数组a,并与days中的数字进行逐一比较,判断是否连续匹配四位数字。

   // 输出四位数字连续出现的总次数
   cout<<sum;
   return 0; // 返回执行成功
}

最后输出四位数字连续出现的总次数,并返回执行成功。

  • 26
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张謹礧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值