蓝桥杯高频考点-与日期相关的题目

news2025/1/21 8:59:41

文章目录

  • 前言
  • 1. 如何枚举合法日期
    • 1.1 预存每个月的天数
    • 1.2 封装一个判断日期是否合法的函数
    • 1.3 枚举日期并判断日期是否合法
  • 2. 判断日期是否为回文日期
    • 2.1 将日期当作字符串进行处理
    • 2.2 将日期当作一个8位数进行处理
  • 3. 给定初始日期,计算经过n天后对应的日期
    • 3.1 得到某年某月的天数
    • 3.2 计算经过n天后的日期
  • 4. 练习
    • 4.1 回文日期
    • 4.2 跑步锻炼
    • 4.3 日期统计
    • 4.4 回文日期
  • 5. 拓展-与时间相关的题目
    • 5.1 例题
      • 5.1.1 题目描述
      • 5.1.2 题目链接
    • 5.2 解题思路
    • 5.3 参考题解

前言

纵观蓝桥杯近几年的真题,与日期相关的题目经常出现

为了节省我们宝贵的比赛时间,对于与日期相关的题目,我们需要构造一套属于自己的模版

1. 如何枚举合法日期

对于日期,我们一般把它当作一个8位的数字进行处理,前四位数字是年份,第五位和第六位数字是月份,最后两位数字是当前月份的天数

一般是先枚举日期,再判断日期是否合法

1.1 预存每个月的天数

创建一个全局范围的数组,用于预存每个月的天数。

之所以要创建全局范围的数组,是为了避免函数之间的传参操作。

int days[15] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

1.2 封装一个判断日期是否合法的函数

bool isLegal(int date) {
    int year = date / 10000;
    int month = date / 100 % 100;
    int day = date % 100;
    if (month > 12 || month < 1) {
        return false;
    }
    if (day < 1 || day > 31) {
        return false;
    }
    int isLeap = 0;
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        isLeap = 1;
    }
    if (month == 2) {
        if (day > days[month] + isLeap) {
            return false;
        }
    } else {
        if (day > days[month]) {
            return false;
        }
    }
    return true;
}

1.3 枚举日期并判断日期是否合法

以2024年为例,枚举2024年的所有合法日期

#include <iostream>

using namespace std;

int days[15] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool isLegal(int date) {
    int year = date / 10000;
    int month = date / 100 % 100;
    int day = date % 100;
    if (month > 12 || month < 1) {
        return false;
    }
    if (day < 1 || day > 31) {
        return false;
    }
    int isLeap = 0;
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        isLeap = 1;
    }
    if (month == 2) {
        if (day > days[month] + isLeap) {
            return false;
        }
    } else {
        if (day > days[month]) {
            return false;
        }
    }
    return true;
}

int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    for (int i = 20240101; i <= 20241231; i++) {
        if (isLegal(i)) {
            cout << i << endl;
        }
    }
    return 0;
}

2. 判断日期是否为回文日期

方法2.2的运行效率远高于方法2.1

如果开始日期和结束日期相差超过100年,建议使用方法2.2

2.1 将日期当作字符串进行处理

要判断一个日期是否是回文日期,可以先将该日期转成字符串

将反转后的字符串与原字符串对比,如果相等则说明该日期是回文日期

该方法需要包含<string>头文件和<algorithm>头文件,而且C++的版本要大于等于C++11

bool check01(int date) {
    string str = to_string(date);
    string temp = str;
    reverse(temp.begin(), temp.end());
    return str == temp;
}

check01函数也可写成下面的形式(无需包含<algorithm>头文件)

bool check01(int date) {
    string str = to_string(date);
    if (str[0] == str[7] && str[1] == str[6] && str[2] == str[5] && str[3] == str[4]) {
        return true;
    }
    return false;
}

2.2 将日期当作一个8位数进行处理

将日期当作一个8位数的整数,利用基础的运算符号反转整数,然后判断反转后的整数与原整数是否相等

bool check02(int date) {
    int originalNumber = date;
    int reverseNumber = 0;

    while (date != 0) {
        reverseNumber = reverseNumber * 10 + date % 10;
        date = date / 10;
    }

    return originalNumber == reverseNumber;
}

以下例子求的是1949年到2049年之间的所有回文日期

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int days[15] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool isLegal(int date) {
    int year = date / 10000;
    int month = date / 100 % 100;
    int day = date % 100;
    if (month > 12 || month < 1) {
        return false;
    }
    if (day < 1 || day > 31) {
        return false;
    }
    int isLeap = 0;
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        isLeap = 1;
    }
    if (month == 2) {
        if (day > days[month] + isLeap) {
            return false;
        }
    } else {
        if (day > days[month]) {
            return false;
        }
    }
    return true;
}

bool check01(int date) {
    string str = to_string(date);
    string temp = str;
    reverse(temp.begin(), temp.end());
    return str == temp;
}

bool check02(int date) {
    int originalNumber = date;
    int reverseNumber = 0;

    while (date != 0) {
        reverseNumber = reverseNumber * 10 + date % 10;
        date = date / 10;
    }

    return originalNumber == reverseNumber;
}

int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    for (int i = 19490101; i <= 20491231; i++) {
        if (isLegal(i) && check02(i)) {
            cout << i << endl;
        }
    }
    return 0;
}

3. 给定初始日期,计算经过n天后对应的日期

3.1 得到某年某月的天数

int getDay(int year, int month) {
    if (month != 2) {
        return days[month];
    } else {
        int leap = year % 400 || (year % 4 == 0 && year % 100 != 0);
        return 28 + leap;
    }
}

3.2 计算经过n天后的日期

int pass(int startDate, int n) {
    int year = startDate / 10000;
    int month = startDate / 100 % 100;
    int day = startDate % 100;
    for (int i = 1; i <= n; i++) {
        day++;
        if (day > getDay(year, month)) {
            month++;
            day = 1;
        }
        if (month > 12) {
            year++;
            month = 1;
        }
    }
    return year * 10000 + month * 100 + day;
}

4. 练习

4.1 回文日期

题目链接:回文日期

4.2 跑步锻炼

题目链接:跑步锻炼

4.3 日期统计

题目链接:日期统计

4.4 回文日期

题目链接:回文日期

5. 拓展-与时间相关的题目

处理时间一般会使用到运用求余、除法这两种基本运算

5.1 例题

5.1.1 题目描述


在这里插入图片描述

5.1.2 题目链接

题目链接:时间显示

5.2 解题思路

  • long long类型的数据接收数据

  • 由于题目给出的时间是以毫秒为单位的,因此要先将时间除以1000变成以秒为单位

  • 因为不需要显示年、月、日,所以要先过滤掉年、月、日的秒数

  • 最后,利用求余、除法运算得到时、分、秒

5.3 参考题解

时、分、秒不足两位时要补前导0

#include <cstdio>

using namespace std;

int main() {
    long long time;
    scanf("%lld", &time);

    time = time / 1000; // 将以毫秒为单位转化为以秒为单位
    time = time % (60 * 60 * 24); // 过滤掉年、月、日的秒数

    long long hour = time / 3600; // 一小时3600秒
    long long minute = time / 60 % 60; // 一分钟60秒
    long long second = time % 60;
    printf("%02lld:%02lld:%02lld", hour, minute, second);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1719352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ai晚班车531

1.中央网信办等三部门&#xff1a;加快推进大模型、生成式人工智能标准研制。 2.中国石油与中国移动、华为、科大讯飞签署合作协议。 3.Opera浏览器与谷歌云合作&#xff0c;接入 Gemini 大模型。 4.谷歌 Gemini 加持Chromebook Plus。 5.英飞凌&#xff1a;开发 8kW和12kW…

5.25.1 用于组织病理学图像分类的深度注意力特征学习

提出了一种基于深度学习的组织病理学图像分类新方法。我们的方法建立在标准卷积神经网络 (CNN) 的基础上,并结合了两个独立的注意力模块,以实现更有效的特征学习。 具体而言,注意力模块沿不同维度推断注意力图,这有助于将 CNN 聚焦于关键图像区域,并突出显示判别性特征通…

Redis 探索之旅(进阶)

目录 今日良言&#xff1a;从不缺乏从头开始的勇气 一、持久化 1、RDB 2、AOF 二、Redis 的事务 三、主从复制 四、哨兵模式 五、集群模式 六、缓存 七、分布式锁 今日良言&#xff1a;从不缺乏从头开始的勇气 一、持久化 持久化就是把数据存储在硬盘上&#xff0c;无…

使用 DuckDuckGo API 实现多种搜索功能

在日常生活中&#xff0c;我经常使用搜索引擎来查找信息&#xff0c;如谷歌和百度。然而&#xff0c;当我想通过 API 来实现这一功能时&#xff0c;会发现这些搜索引擎并没有提供足够的免费 API 服务。如果有这样的免费 API, 就能定时获取“关注实体”的相关内容&#xff0c;并…

高通开发系列 - ubuntu中的docker安装debian镜像

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 概述当前状态Ubuntu中安装dockerDebian镜像Debian容器中操作更改Debian源安装应用程序

推荐:4本易发表的优质SSCI期刊,含期刊官网!

01、Risk Management and Healthcare Policy 开源四区&#xff0c;国人发表占比25%&#xff0c;发表量前三的国家分别是中国、埃塞俄比亚和美国。 该期刊对国人友好&#xff0c;年度发文量400多&#xff0c;影响因子3.6。 主要刊发公共卫生相关的文章。 研究者可以围绕居民…

【第十三节】C++控制台版本坦克大战小游戏

目录 一、游戏简介 1.1 游戏概述 1.2 知识点应用 1.3 实现功能 1.4 开发环境 二、项目设计 2.1 类的设计 2.2 各类功能 三、程序运行截图 3.1 游戏主菜单 3.2 游戏进行中 3.3 双人作战 3.4 编辑地图 一、游戏简介 1.1 游戏概述 本项目是一款基于C语言开发的控制台…

【学习笔记】Windows GDI绘图(九)Graphics详解(上)

文章目录 Graphics 定义创建Graphics对象的方法通过Graphics绘制不同的形状、线条、图像和文字等通过Graphics操作对象坐标 Graphics属性Clip(裁切/绘制区域)ClipBounds获取裁切区域矩形范围CompositiongMode合成方式CompositingQuality渲染质量DpiX和DpiY 水平、垂直分辨率Int…

2024年5月31日 (周五) 叶子游戏新闻

《Granblue Fantasy: Relink》版本更新 新增可操控角色及功能世嘉股份有限公司现已公开《Granblue Fantasy: Relink》&#xff08;以下简称 Relink&#xff09;免费版本更新ver.1.3.1于5月31日&#xff08;周五&#xff09;上线的消息。该作是由Cygames Inc.&#xff08;下称Cy…

SpringSecurity6从入门到实战之Filter过滤器回顾

SpringSecurity6从入门到实战之Filter过滤器回顾 如果没有SpringSecurity这个框架,我们应该通过什么去实现客户端向服务端发送请求时,先检查用户是否登录,登录了才能访问.否则重定向到登录页面 流程图如下 官方文档&#xff1a;https://docs.spring.io/spring-security/referen…

实际测试stm32中断优先级

HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);第一个函数 HAL_NVIC_SetPriority 是用来设置单个优先级的抢占优先级和响应优先级的值。第二个…

改进YOLOv8系列:构建新型单头transformer模块,加入到骨干尾部

改进YOLOv8系列:构建新型单头transformer模块,加入到骨干尾部 需要修改的代码self attention代码创建yaml文件测试是否创建成功本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者…

服务器迁徙大作战:从虚拟到物理的服务迁移全攻略

时光匆匆&#xff0c;发现自己已经很久没有动笔写博客了。瞥了一眼掘金&#xff0c;上一篇博客居然还停留在22年。五年间&#xff0c;似乎自己变得越发慵懒&#xff0c;或许是因为一旦进入舒适区&#xff0c;就不太愿意再去挑战自己&#xff0c;不管是在技术上还是生活中。刚毕…

【Linux】磁盘结构文件系统软硬链接动静态库

目录 一.磁盘结构 1、磁盘的物理结构 2、磁盘的存储结构 3、磁盘的逻辑结构 二.文件系统 1、对IO单位的优化 2、磁盘分区与分组 3、对分组的具体管理方法 4、文件操作 三.软硬链接 1、理解硬链接 2、理解软连接 3、理解.和.. 四、动静态库 1、什么是动静态库 2、…

Threejs(WebGL)绘制线段优化:Shader修改gl.LINES模式为gl.LINE_STRIP

目录 背景 思路 Threejs实现 记录每条线的点数 封装原始裁剪索引数据 封装合并几何体的缓冲数据&#xff1a;由裁剪索引组成的 IntArray 守住该有的线段&#xff01; 修改顶点着色器 修改片元着色器 完整代码 WebGL实现类似功能&#xff08;简易版&#xff0c;便于测…

线性代数|机器学习-P1课程简介

文章目录 1. 书籍下载2. 正文 1. 书籍下载 链接&#xff1a;https://pan.baidu.com/s/1QbK0enLh0x4nU1c4Tqwlkw 提取码&#xff1a;r7ft 本课程回顾线性代数在概率论、统计学、优化和深度学习中的应用。是GILBERT STRANG教授的有一个经典的课程。课程将线性代数分为如下部分&a…

Android Studio启动第一个项目的报错——笔记

零基础第一次使用Android Studio开发遇到的问题 1 新建项目下载gradle慢的问题 直接叉掉打开gradle官网手动下载自己想要的版本 gradle官网 然后在刚刚建好的项目里找到gradle-wrapper.properties&#xff0c;修改distributionUrl&#xff0c;并把自己从官网下载的包放到和gr…

SQLRecon:一款针对MSSQL的网络侦查与后渗透测试工具

关于SQLRecon SQLRecon是一款针对Microsoft SQL Server的安全研究工具&#xff0c;该工具专为红队研究人员设计&#xff0c;可以帮助广大研究人员针对MSSQL执行网络侦查和后渗透利用测试。 工具安装 广大研究人员可以直接访问该项目的【Releases页面】下载预编译的最新版本SQ…

WHAT - 用户登录系列(二)- 单点登录 SSO

目录 一、认证机制1.1 基于会话的认证&#xff08;Session-based Authentication&#xff09;1. 介绍2. 基本流程 1.2 JSON Web Tokens (JWT)1. 介绍2. jwt 组成3. 基本流程4. 阻止列表5. 刷新令牌 二、单点登录&#xff1a;SSO2.1 单系统登录2.2 SSO 介绍2.3 SSO 登录2.4 SSO …

从零开始学习Slam-旋转矩阵旋转向量四元组(二)

本文参考&#xff1a;计算机视觉life 仅作笔记用 书接上回&#xff0c;上回不清不楚的介绍了旋转矩阵&旋转向量和四元组 现在回顾一下重点&#xff1a; 本着绕谁谁不变的变则 假设绕z轴旋转θ&#xff0c;旋转矩阵为&#xff1a; 再回顾一下旋转向量的表示以及这个基本记不…