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

文章目录

  • 前言
  • 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java集合【超详细】2 -- Map、可变参数、Collections类

文章目录 一、Map集合1.1 Map集合概述和特点【理解】1.2 Map集合的基本功能【应用】1.3 Map集合的获取功能【应用】1.4 Map集合的两种遍历方式 二、HashMap集合2.1 HashMap集合概述和特点【理解】2.2 HashMap的组成、构造函数2.3 put、查找方法2.4 HashMap集合应用案例【应用】…

另一棵树的子树(oj题)

一、题目链接 https://leetcode.cn/problems/subtree-of-another-tree/submissions/536304222 二、题目思路 1.首先遍历大树&#xff0c;判断大树的根结点的值是否等于小树的根结点的值&#xff0c;如果不相等&#xff0c;就找大树的左孩子或者右孩子&#xff0c;以左孩子为根…

博士毕业论文/CTEX/LATEX

LATEX环境安装 CTEX 安装 &#xff08;垃圾&#xff0c;不要装&#xff09; 运行 clean.batcomp.bat 缺少字体 Couldn’t find Adobe Heiti S.cfg’ miktex-maketfm: No creation rule for font “Adobe Heiti Std”.解决方法&#xff1a;其实就是下载这四个字体之后&…

jsp实验19 File

三、源代码以及执行结果截图&#xff1a; readJSPFile.jsp <% page contentType"text/html" %> <% page pageEncoding "utf-8" %> <% page import"java.io.*"%> <style> #tom{ font-family:宋体;font-size:2…

Crosslink-NX器件应用连载(10): 图像输入并通过HDMI输出

作者&#xff1a;Hello,Panda 大家下午好&#xff0c;晚上好。这里分享一个Lattice Crosslink-NX器件通过MIPI或LVDS输入图像&#xff0c;并通过HDMI输出图像的案例&#xff08;其实这是个比较冷门的需求&#xff0c;Crosslink-NX器件还是主要做MIPI桥接用&#xff09;。 咱们…

《Kubernetes部署篇:基于麒麟V10+ARM64架构部署harbor v2.4.0镜像仓库》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 一、环境信息 K8S版本 操作系统 CPU架构 服务版本 1.26.15 Kylin Linux Advanced Server V10 ARM64 harbor v2.4.0 二、部…

文刻创作AI工具怎么注册卡密

在科技日新月异的今天&#xff0c;生成式人工智能&#xff08;AI&#xff09;的迅猛发展正在重塑各行各业的面貌。其中&#xff0c;文刻创作AI工具以其独特的魅力和强大的功能&#xff0c;成为了内容创作领域的一股清流&#xff0c;引领着内容生产的新潮流。 【文刻二创工具教…

人脸识别模型与人类视觉识别的对比——评估人脸识别模型存在偏见是否比人类的偏见大?

1. 概述 人脸识别系统是一个几十年来一直备受关注的研究领域。而且在过去的几年中。公司和政府一直在积极引入人脸识别系统&#xff0c;并且我们看到越来越多的机会可以看到人脸识别系统。例如&#xff0c;有的系统可以随便介绍&#xff0c;如搜索特定人的图像&#xff08;图像…

SAP Build引言

前言 SAP Build 似乎是一个整合了很多低代码或无代码产品的平台&#xff0c;最早的时候应该都是各自分开的几个产品&#xff0c;近年合并到一块上了SAP Build平台 现在看官网的介绍应该是有三四个产品被集成进来了&#xff0c;分别是SAP IRPA&#xff0c;SAP Workflow&#xf…

K8s Ingress 详解

文章目录 K8s Ingress 详解Ingress 资源清单Ingress 基于URL 实现路由Ingress 基于名称虚拟主机Ingress 实现HTTPS创建TLS 证书创建Secrets配置ingress Ingress RewriteIngress 灰度发布Ingress 配置认证 K8s Ingress 详解 Ingress 资源清单 apiVersion: networking.k8s.io/v…

编程学习 (C规划) 6 {24_4_18} 七 ( 简单扫雷游戏)

首先我们要清楚扫雷大概是如何实现的&#xff1a; 1.布置雷 2.扫雷&#xff08;排查雷&#xff09; &#xff08;1&#xff09;如果这个位置是雷就炸了&#xff0c;游戏结束 &#xff08;2&#xff09;如果不是雷&#xff0c;就告诉周围有几个雷 3.把所有不是雷的位置都找…

【Unity脚本】使用脚本操作游戏对象的组件

【知识链】Unity -> Unity脚本 -> 游戏对象 -> 组件 【知识链】Unity -> Unity界面 -> Inspector【摘要】本文介绍如何使用脚本添加、删除组件&#xff0c;以及如何访问组件 文章目录 引言第一章 游戏对象与组件1.1什么是组件&#xff1f;1.2 场景、游戏对象与组…

C++11中的新特性(2)

C11 1 可变参数模板2 emplace_back函数3 lambda表达式3.1 捕捉列表的作用3.2 lambda表达式底层原理 4 包装器5 bind函数的使用 1 可变参数模板 在C11之前&#xff0c;模板利用class关键字定义了几个参数&#xff0c;那么我们在编译推演中&#xff0c;我们就必须传入对应的参数…

Mac安装第三方软件的命令安装方式

场景&#xff1a; 打开终端命令行&#xff0c;sudo xattr -rd com.apple.quarantine&#xff0c;注意最后quarantine 后面加一个空格&#xff01;然后打开Finder&#xff08;访达&#xff09;&#xff0c;点击左侧的 应用程序&#xff0c;找到相关应用&#xff0c;拖进终端qua…

指纹浏览器大全

具体请前往&#xff1a;国内外指纹浏览器大全

vue3组件通信与props

title: vue3组件通信与props date: 2024/5/31 下午9:00:57 updated: 2024/5/31 下午9:00:57 categories: 前端开发 tags: Vue3组件Props详解生命周期数据通信模板语法Composition API单向数据流 Vue 3 组件基础 在 Vue 3 中&#xff0c;组件是构建用户界面的基本单位&#…

V90 PN总线伺服通过FB285速度控制实现正弦位置轨迹运动(解析法和数值法对比测试)

V90总线伺服相关内容请参考专栏系列文章,这里不在详述 1、V90伺服PN总线速度随动控制 V90伺服PN总线速度随动控制(手摇轮功能)_手摇轮可以接总线plc吗?-CSDN博客文章浏览阅读632次。V90PN总线控制相关内容,请参考下面文章链接:博途1200/1500PLC V90 PN通信控制 (FB284功能…

构建企业级AI私有知识库

一、引言 在当今竞争激烈的市场环境中&#xff0c;企业为了保持竞争优势&#xff0c;需要高效地管理和利用内部知识资源。构建一个企业级AI私有知识库&#xff0c;不仅可以集中存储和管理企业知识&#xff0c;还能通过人工智能技术实现知识的智能化处理和利用。本文将详细介绍…

模型 STORY评估框架

说明&#xff1a;系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。故事五要素&#xff1a;结构、时间、观点、现实、收益 。 1 STORY评估框架的应用 1.1 STORY模型展示其个性化在线学习解决方案的优势 一家在线教育平台想要通过一个故事来展示其个性…

Spring 框架:Java 企业级开发的基石

文章目录 序言Spring 框架的核心概念Spring 框架的主要模块Spring Boot&#xff1a;简化 Spring 开发Spring Cloud&#xff1a;构建微服务架构实际案例分析结论 序言 Spring 框架自 2002 年发布以来&#xff0c;已经成为 Java 企业级开发的标准之一。它通过提供全面的基础设施…