日期问题---算法精讲

news2025/6/8 19:11:04

前言

今天讲讲日期问题,所谓日期问题,在蓝桥杯中出现众多,但是解法比较固定。

一般有判断日期合法性,判断是否闰年,判断日期的特殊形式(回文或abababab型等)

目录

例题 

题2

题三

总结

先枚举日期,再根据题意判断,而不是先模拟题意进行构造日期

判断日期合法性(月份判断,日判读,闰年判断等) 

从一个八位数中一次取出年月日


 

例题 

回文日期

题目的本意是在给定date1与date2之间找出所有的回文日期的个数

对于一个回文日期

对于此题,我们有两种思路 

①是构造回文日期,判断日期合法性,再计算符合范围的回文日期的个数。

②是先从全部枚举日期,构造回文日期,再判断日期的合法性与找出符合条件日期。

这里判断日期的合法性指,份必须要在12月内,

必须要在对应月份合理的天数,在此还需要判断是否是闰年

显然思路①明显比较困难, 构造回文日期比较难,所以我们采取思路2

所以大致思路如下:

枚举日期时候,我们只需枚举年份(从1000到9999)(即前四位) 

 

通过年份构造回文日期时,有以下思路 

 for(int i=1000;i<=9999;i++)
    {
        int s=i,x=i;
        for(int k=0;k<4;k++)
        {
            s=s*10+x%10;//x模运算是依次取出每一个数
            x=x/10;
        }
        if(date1<=s && s<=date2 && check(s)){res++;}
    }

一个例子: 

代码如下:

#include<cstdio>
int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//月份对应天数
bool check(int date)
{
    int year=date/10000;
    int month=date%10000/100;
    int day=date%100;
    
    if(month==0||month>12){return false;}
    if(day==0||month!=2 && day>arr[month]){return false;}
    
    if(month==2)//2月需要特判
    {
        int j= year%400==0||year%4==0&&year%100!=0;//是闰年j为1,否则为0
        if(day>arr[month]+j||day<1){return false;}
    }
    return true;
}
int main()
{
    int date1,date2;
    scanf("%d%d",&date1,&date2);
    int res=0;
    
    for(int i=1000;i<=9999;i++)
    {
        int s=i,x=i;
        for(int k=0;k<4;k++)
        {
            s=s*10+x%10;
            x=x/10;
        }   //此时s为回文日期
        if(date1<=s && s<=date2 && check(s)){res++;}
    }
    printf("%d",res);
}

 

题2

回文日期2

题目本意是给出一个日期,寻找下一个回文日期和ABABBABA型的日期

我们分析ABABBABA型有特殊性,它也是回文日期

这样我们在回文日期种在判断它是否是ABABBABA型即可。

对于判读ABABBABA型, 有以下条件

它的个位数与十位数不相等,个位数与百位数相等,十位数与千位数相等。

 

代码如下:

#include<cstdio>
int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int i)//判断日期合法性
{
    int year=i/10000,month=i%10000/100,day=i%100;
    if(month==0||month>12){return false;}
    if(month!=2 && day>arr[month]||day==0){return false;}
    if(month==2)
    {
        int j=year%400==0||year%4==0&&year%100!=0;
        if(day>arr[month]+j||day==0){return false;}
    }
    return true;
}
int main()
{
    int n;
    scanf("%d",&n);
    int acc=0,abb=0;//判断是否第一次出现回文日期和ABABBABA式日期
    for(int i=n/10000;;i++)//要一直循环
    {
        int x=i,j=i;
        for(int k=0;k<=3;k++)
        {
            x=x*10+j%10;
            j=j/10;
            
        }
        //x为构造后的回文日期
        
        if(check(x)&&x>n)//判读日期合法性,判断日期大于给定日期
        {
            if(acc!=1){printf("%d\n",x);acc=1;}//第一次输出回文日期
              
            int num1 = x%10, num2 = x/10%10, num3=x/100%10, num4=x/1000%10;
            //分别取个,十,百,千位数
            if(abb!=1&&num2!=num1&&num1==num3&&num2==num4)//判断ABABBABA
            {
                printf("%d\n",x);
                abb=1;
            }
            if(acc==1&&abb==1){break;}//找完跳出循环
        }
        if(acc==1&&abb==1){break;}
    }
}

 

题三

日期问题(困难) 

 

例如:

输入:   02/03/04

输出:2002-03-04

           2003-02-03

           2004-03-04 

本题:对于输入而言,有三种情况:年/月/日,日/月/年/,月/日/年 

本题中如果对给出的输入模拟出可能出现的日期比较困难,不妨采取先枚举所有日期

判断日期合法性,然后判断这些日期是否在给定输入的可能值里面。

代码如下

#include<cstdio>

int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int year,int month,int day)
{
    if(year<1960||year>2059)return false;
    if(month<1||month>12)return false;
    if(month!=2)
    {
        if(day>arr[month]||day<1) return false;
    } 
    else 
    {
        int leap= year%4==0&&year%100!=0 || year%400==0;//闰年leap为1;
        if(day>arr[month]+leap||day<1){return false;}
    }
    return true;
}
int main()
{
    int a,b,c;
    scanf("%d/%d/%d",&a,&b,&c);
    
    for(int i=19600101;i<=20591231;i++)//枚举所有日期
    {
        int year=i/10000,month=i%10000/100, day=i%100;//取出年月日
        if(check(year,month,day))//判断日期合法性
        {
            int yea=year%100;//取出年份的后两位       
            if(yea==a&&month==b&&day==c||yea==c&&month==a&&day==b||
               yea==c&&month==b&&day==a)//判断可能的值
            {
                printf("%d-%02d-%02d\n",year,month,day);//格式化输入
            }
        }
    }
    return 0;
}

注意这里输出与输入

··scanf ("%d /%d/ %d",&a ,&b ,&c);     //过滤掉输入的   /

··printf ("%d-%02d-%02d\n" , year,month,day);    //%02d意为输出两位,不足两位补上前导0

 

总结

这三到题都有很大的相似性

  • 先枚举日期,再根据题意判断,而不是先模拟题意进行构造日期

  • 判断日期合法性(月份判断,日判读,闰年判断等) 

bool check(int date)//一个八位的日期包含年月日
{
    int year=date/10000;  //取出年
    int month=date%10000/100;  //取出月
    int day=date%100;  //取出日
    
    if(month==0||month>12){return false;}
    if(day==0||month!=2 && day>arr[month]){return false;}
    if(month==2)//2月需要特判
    {
        int j= year%400==0||year%4==0&&year%100!=0;//是闰年j为1,否则为0
        if(day>arr[month]+j||day<1){return false;}
    }
    return true;//其他为合法日期,返回真
}
  • 从一个八位数中一次取出年月日

例如20201018------取2020年取10月取18 日

其中有公式 运算:     

%10^n  ························取出一个数的后n位

/ 10^n    ························取出一个数的前n位

//date为一个八位数
int year=date/10000;  //取出年
int month=date%10000/100;  //取出月
int day=date%100;  //取出日

                   


本篇博客到此结束,谢谢大家观看,如果各位博友们有好的建议或好的想法,

欢迎留言喔,谢谢大家! 

 

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

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

相关文章

docker 子网

当需要给容器分配指定 ip &#xff0c;为避免ip 冲突&#xff0c;指定容器子网处理 创建 subnet 子网 docker network create --subnet 10.0.0.0/24 --gateway 10.0.0.1 subnet-testdocker network ls NETWORK ID NAME DRIVER SCOPE ... f582ecf297bc sub…

跑马灯样式

这里的公告是要做成&#xff0c;跑马灯的样式&#xff0c;文字是会移动并且隐藏掉的。 HTML&#xff1a; <div class"notice"><div class"yrr"><img src"./img/ia_100000018.png" alt"" /></div><div …

(关键点检测)YOLOv8实现多类人体姿态估计的输出格式分析

&#xff08;关键点检测&#xff09;YOLOv8实现多类人体姿态估计的输出格式分析 任务分析 所使用的数据配置文件 网络结构 导出模型 用 netron 可视化 输出格式分析 参考链接 1. 任务分析 判断人体关键点时一并给出关键点所属的类别&#xff0c;比如男人&#xff0c;女…

使用Tokeniser估算GPT和LLM服务的查询成本

将LLM集成到项目所花费的成本主要是我们通过API获取LLM返回结果的成本&#xff0c;而这些成本通常是根据处理的令牌数量计算的。我们如何预估我们的令牌数量呢&#xff1f;Tokeniser包可以有效地计算文本输入中的令牌来估算这些成本。本文将介绍如何使用Tokeniser有效地预测和管…

如何在Mapbox GL中处理大的GEOJSON文件

Mapbox GL可以将 GeoJSON 数据由客户端(Web 浏览器或移动设备)即时转换为 Mapbox 矢量切片进行显示和处理。本文的目的是教大家如何有效加载和渲染大型 GeoJSON 源,并优化渲染显示速度,增强用户体验,减少客户端卡顿问题。本文以Mapbox 为例,至于其它框架原理大致相同,可…

对中国境内所有地区KFC门店基本信息的统计(简略版)

我们要获取每个地区的kfc信息就要先获取中国一共有哪些地区 中国所有城市名称获取 import requests from lxml import etreewith open(f./省份.txt, w) as fp:fp.write() with open(f./城市.txt, w) as fp:fp.write()url1http://www.kfc.com.cn/kfccda/storelist/index.aspx#…

golang实现正向代理和反向代理

文章目录 正向代理反向代理区别与联系:总结代理服务器实现正向代理反向代理正向代理 正向代理是客户端代理,它位于客户端和目标服务器之间。它的作用是保护客户端的隐私和安全。 如我们现在想要访问谷歌,但是由于某些原因,无法直接访问到谷歌,我们可以通过连接一台代理服务…

2024 年中国高校大数据挑战赛赛题 D:行业职业技术培训能力评价完整思路以及源代码分享

中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴 熟的技术工人进入工厂。某行业在全国有多所不同类型&#xff08;如国家级、 省级等&#xff09;的职业技术培训学校&#xff0c;进行 5 种技能培训。学员入校时需要 进行统一的技能考核&#xf…

Feign实现微服务间远程调用续;基于Redis实现消息队列用于延迟任务的处理,Redis分布式锁的实现;(黑马头条Day05)

目录 延迟任务和定时任务 使用Redis设计延迟队列原理 点评项目中选用list和zset两种数据结构进行实现 如何缓解Redis内存的压力同时保证Redis中任务能够被正确消费不丢失 系统流程设计 使用Feign实现微服务间的任务消费以及文章自动审核 系统微服务功能介绍 提交文章-&g…

LCR 131. 砍竹子 I

解题思路&#xff1a;&#xff08;与砍竹子II的区别是&#xff0c;这里的竹子长度数量级较小&#xff09; 数学推导或贪心 切分规则&#xff1a; 等长&#xff0c;且尽量为3 b0时&#xff0c;pow(3,a) b1时&#xff0c;pow(3,a-1)*4 少一段3&#xff0c;并入b生成一…

T2 小美的平衡矩阵(25分) - 美团编程题 题解

考试平台&#xff1a; 牛客网 题目类型&#xff1a; 30道单选题&#xff08;60分&#xff09; 2 道编程题 &#xff08;15分 25分&#xff09; 考试时间&#xff1a; 2024-03-09 &#xff08;两小时&#xff09; 题目描述 小美拿到了一个n*n的矩阵&#xff0c;其中每个元素是…

HTML 学习笔记(五)超链接

HYperText 超文是用超链接的方式&#xff0c;将不同空间的文字信息组合在一起的网状文其就像一个桥梁&#xff0c;建立了不同页面中的联系&#xff0c;实现了访问不同网站中页面的功能 <!DOCTYPE html> <html lang"en"><head><meta charset&qu…

HarmonyOS NEXT应用开发之MpChart图表实现案例

介绍 MpChart是一个包含各种类型图表的图表库&#xff0c;主要用于业务数据汇总&#xff0c;例如销售数据走势图&#xff0c;股价走势图等场景中使用&#xff0c;方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示&#xf…

Linux多线程之初识多线程

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、线程概念 1.vm_area_struct 2.页帧与页…

在Blender中清理由Instant-NGP等几何学习技术生成的网格

使用布尔运算: 创建一个大的立方体或其他简单几何体包裹住全部网格。使用布尔修改器对两个网格进行“差集”运算。这将移除超出包裹体之外的多余网格部分。 手动选择并删除: 进入编辑模式&#xff08;按Tab键&#xff09;。按A键取消选择所有顶点。按B键并拖动以选择您想要删除…

❤ Vue3项目搭建系统篇(二)

❤ Vue3项目搭建系统篇&#xff08;二&#xff09; 1、安装和配置 Element Plus&#xff08;完整导入&#xff09; yarn add element-plus --savemain.ts中引入&#xff1a; // 引入组件 import ElementPlus from element-plus import element-plus/dist/index.css const ap…

MySQL-锁:共享锁(读)、排他锁(写)、表锁、行锁、意向锁、间隙锁,锁升级

MySQL-锁&#xff1a;共享锁&#xff08;读&#xff09;、排他锁&#xff08;写&#xff09;、表锁、行锁、意向锁、间隙锁 共享锁&#xff08;读锁&#xff09;、排他锁表锁行锁意向锁间隙锁锁升级 MySQL数据库中的锁是控制并发访问的重要机制&#xff0c;它们确保数据的一致性…

系统安全保证措施-word

【系统安全保证措施-各支撑材料直接套用】 一、 身份鉴别 二、 访问控制 三、 通信完整性、保密性 四、 抗抵赖 五、 数据完整性 六、 数据保密性 七、 应用安全支撑系统设计 软件全套资料下载进主页。

JAVA后端开发面试基础知识(八)——Spring

Spring 1. 什么是 Spring 框架 Spring是一个轻量级Java开发框架 我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地协助我们进行开发&#xff0c;比如说 Spring 支持 IoC&#xff08;Inverse of Control:控…

pta团队天题题-阅览室(c++)

天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时&#xff0c;管理员输入书号并按下S键&#xff0c;程序开始计时&#xff1b;当读者还书时&#xff0c;管理员输入书号并按下E键&#xff0c;程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时…