当前位置: 首页 > news >正文

日期问题---算法精讲

前言

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

一般有判断日期合法性,判断是否闰年,判断日期的特殊形式(回文或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,否则为0if(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,否则为0if(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;  //取出日

                   


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

欢迎留言喔,谢谢大家! 

 

相关文章:

日期问题---算法精讲

前言 今天讲讲日期问题&#xff0c;所谓日期问题&#xff0c;在蓝桥杯中出现众多&#xff0c;但是解法比较固定。 一般有判断日期合法性&#xff0c;判断是否闰年&#xff0c;判断日期的特殊形式&#xff08;回文或abababab型等&#xff09; 目录 例题 题2 题三 总结 …...

倒计时35天

dp预备(来源&#xff1a;b站acm刘春英老师) 1. 2. 3. 4. 5. 6. 7....

JAVA后端开发面试基础知识(七)——多线程

1. 线程池原理 优点 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线…...

Apache的安装与目录结构详细解说

1. Apache安装步骤 Apache是一款开源的Web服务器软件&#xff0c;常用于搭建网站和服务。以下是Apache的安装步骤&#xff1a; 在官方网站&#xff08;https://httpd.apache.org/&#xff09;下载最新版本的Apache软件包。解压下载的软件包到指定目录。运行安装程序&#xff…...

axios的详细使用

目录 axios&#xff1a;现代前端开发的HTTP客户端王者 一、axios简介 二、axios的基本用法 1. 安装axios 2. 发起GET请求 3. 发起POST请求 三、axios的高级特性 1. 拦截器 2. 取消请求 3. 自动转换JSON数据 四、axios在前端开发中的应用 五、总结 axios&#xff1a…...

空间复杂度的OJ练习——轮转数组

旋转数组OJ链接&#xff1a;https://leetcode-cn.com/problems/rotate-array/ 题目&#xff1a; 思路&#xff1a; 通过题目我们可以知道这是一个无序数组&#xff0c;只需要将数组中的数按给定条件重新排列&#xff0c;因此我们可以想到以下几种方法&#xff1a; 1.暴力求解法…...

学习与学习理论 - 2024教招 - test

一 方向 所有学习理论大的观点&#xff0c;到某个人物个人的观点。抖音&#xff1a;按照粉丝数量、收藏数量、点赞数量排名从编程&#xff08;思想&#xff09;、java、自己所拥有的特点看学习方法顺序&#xff1a;java、自身、教学理论的总观点、教学理论代表人物的观点、散兵…...

Spring web开发(入门)

1、我们在执行程序时&#xff0c;运行的需要是这个界面 2、简单的web接口&#xff08;127.0.0.1表示本机IP&#xff09; package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestCont…...

这是谁的女儿?其母亲早已红过头了,现在小小年纪的她也爆红网络,没想到吧?

这是谁的女儿&#xff1f;其母亲早已红过头了&#xff0c;现在小小年纪的她也爆红网络&#xff0c;没想到吧&#xff1f; 原来&#xff0c;作母亲的她在红极一时后似乎沉寂了下来&#xff0c;没想到她11岁的女儿近年来也在社交媒体上走红&#xff0c;她为何也成了小网红呢&…...

鸿蒙开发之gson解析

作为老牌的Java程序员,几乎每个项目都逃不掉fastjson/gson等三方库。那么在OpenHarmony/HarmonyOS应用开发中,做数据解析时能不能使用fastjson/gson三方库呢?于是我搜索了一下,其实在arkts开发过程中也是可以使用JS里自带的JSONparse和JSONstringify方法来实现JSON和对象转…...

图形库实战丨C语言扫雷小游戏(超2w字,附图片素材)

目录 效果展示 游玩链接&#xff08;无需安装图形库及VS&#xff09; 开发环境及准备 1.VS2022版本 2.图形库 游戏初始化 1.头文件 2.创建窗口 3.主函数框架 开始界面函数 1.初始化 1-1.设置背景颜色及字体 1-2.处理背景音乐及图片素材 1-3.处理背景图位置 2.选…...

c++: string中 find, rfind, find_frist_of, find_laste_of 与 substr之间的操作

在 C 的 std::string 类中&#xff0c;有几个成员函数可以用于在字符串中执行搜索和子字符串提取操作。以下是这些函数的简要说明&#xff1a; find(): 查找子字符串的第一个出现位置。 size_t find(const string& str, size_t pos 0) const; size_t find(const char* s, …...

[python3] dataclass的对象排序

在使用 dataclass(orderTrue) 中&#xff0c;会比较数据类中定义的所有属性。具体来说&#xff0c;生成的比较运算符方法会按照数据类中定义属性的顺序逐个比较属性的取值。 下面是一个示例代码&#xff0c;演示了 orderTrue 比较数据类中所有属性的情况&#xff1a; from da…...

数据库基础——mysql知识体系(掌握mysql,看完这篇文章就够了)

1.关系型数据库 关系型数据库是一种基于关系模型的数据库系统&#xff0c;将数据组织成表格的形式&#xff0c;表格由行和列组成&#xff0c;每行代表一个记录&#xff0c;每列代表一个属性。它使用结构化查询语言SQL进行数据管理和操作。 特点&#xff1a;1.数据的组织&…...

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(二)

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验&#xff08;前导&#xff09; Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验&#xff08;一&#xff09; Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验&#xff08;三&#xff09; 五、实验目的 本次实验使用电脑上的…...

高级语言讲义2010计专(仅高级语言部分)

1.编写一程序&#xff0c;对输入的正整数&#xff0c;求他的约数和。 如&#xff1a;18的约数和为1236939 #include <stdio.h>int getsum(int n){int i,sum0;for(i1;i<n;i)if(n%i0)sumi;return sum; } int main(){int sum getsum(18);printf("%d",sum); …...

你喜欢那种舞者呢?

迷宫中的舞者&#xff1a;程序员职业赛道的探索与魅力 在数字世界的深处&#xff0c;程序员的职业赛道宛如一座神秘而迷人的迷宫。这个迷宫中&#xff0c;每个转角都隐藏着无限的可能&#xff0c;每个领域都散发着独特的魅力。前端开发者如同花园中的精灵&#xff0c;后端工程师…...

LeetCode每日一题之 快乐数

目录 题目介绍&#xff1a; 算法原理&#xff1a; 鸽巢原理&#xff1a; 如何找到环里元素&#xff1a; 代码实现&#xff1a; 题目介绍&#xff1a; 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 我先简单举两个例子&#xff…...

【机器学习】在Python中进行K-Means聚类和层次聚类

Python中聚类算法API的使用指南 聚类分析是数据分析中一种常见的无监督学习方法&#xff0c;通过将相似的对象分组在一起&#xff0c;我们能够识别出数据集中的自然分群。本文将介绍如何使用Python中的聚类算法接口&#xff0c;KMeans和层次聚类方法。 K-Means 聚类 K-Means…...

springboot254小区团购管理

小区团购管理设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装小区团购管理软件来发挥其高效地信…...

企业知识库升级:Qwen3-Reranker-0.6B重排序实战案例

企业知识库升级&#xff1a;Qwen3-Reranker-0.6B重排序实战案例 1. 引言&#xff1a;企业知识检索的痛点与解决方案 在当今信息爆炸的时代&#xff0c;企业知识库已成为组织内部信息流转的核心枢纽。然而&#xff0c;传统的关键词匹配和简单向量检索往往难以准确理解用户查询…...

从一次线上告警讲起:Go/Python服务中HTTP Client连接池配置不当引发的TIME_WAIT风暴

从TIME_WAIT风暴到高效连接管理&#xff1a;Go/Python微服务实战解析 凌晨3点&#xff0c;监控系统突然发出刺耳的告警声——某核心服务的响应延迟从50ms飙升到2000ms。登录机器执行netstat -ant | grep TIME_WAIT | wc -l后&#xff0c;终端显示的数字让人心头一紧&#xff1a…...

告别WinForm默认弹窗!手把手教你用C#打造高颜值自定义MessageBox(附完整源码)

从零构建现代化C#消息弹窗&#xff1a;告别WinForm默认样式的终极指南 每次看到WinForm那个灰头土脸的默认MessageBox弹窗&#xff0c;总有种穿越回Windows 98的错觉。在2023年的今天&#xff0c;用户对UI的审美要求早已今非昔比——根据Adobe的调研数据&#xff0c;75%的用户会…...

Dify文档解析优化实战手册(企业级PDF/OCR/多格式混合解析失效全解)

第一章&#xff1a;Dify文档解析优化概述Dify 作为低代码 AI 应用开发平台&#xff0c;其文档解析模块是知识库构建与 RAG 流程的关键前置环节。默认解析器在处理多格式文档&#xff08;如 PDF、Word、Markdown&#xff09;时&#xff0c;常面临结构丢失、表格错位、公式截断及…...

Navigation源码编译踩坑实录:从Amcl报错到完美运行的完整避坑指南

Navigation源码编译实战&#xff1a;从依赖解析到系统集成的深度指南 当你第一次尝试在ROS Melodic环境下从源码编译Navigation堆栈时&#xff0c;那种期待与忐忑交织的感觉我至今记忆犹新。作为一个长期依赖二进制包安装的开发者&#xff0c;转向源码编译不仅意味着对系统更深…...

别再手动种树了!用Forest Pack Pro预设库5分钟搞定3DMAX森林场景

别再手动种树了&#xff01;用Forest Pack Pro预设库5分钟搞定3DMAX森林场景 当你在3DMAX中手动摆放第100棵树时&#xff0c;是否开始怀疑人生&#xff1f;那些看似简单的森林场景&#xff0c;往往消耗设计师80%的时间在重复劳动上。Forest Pack Pro的预设库功能&#xff0c;彻…...

MOS管H桥电路里,为什么上管用PMOS、下管用NMOS?一个动图讲清楚驱动电平那点事

MOS管H桥电路设计&#xff1a;为什么上管用PMOS、下管用NMOS&#xff1f; 在电机驱动和功率开关电路中&#xff0c;H桥拓扑堪称"万能方向盘"——它能轻松实现电机的正反转控制&#xff0c;也是逆变器、D类放大器的核心结构。但当你第一次拆解市面上的H桥模块时&#…...

2026年版|Java开发者转型大模型开发:从入门到实践(小白必收藏)

在2026年AI技术全面爆发的当下&#xff0c;大模型开发早已从“前沿热点”变成“行业刚需”&#xff0c;无论是互联网大厂还是中小企业&#xff0c;都在疯狂布局大模型相关业务。作为一名深耕Java后端多年的开发者&#xff0c;我每天都会收到同行和小白的提问&#xff1a;传统Ja…...

Spark大数据分析实战【1.0】

第1章 Spark简介 本章主要介绍Spark框架的概念、生态系统、架构及RDD等,并围绕Spark的BDAS项目及其子项目进行了简要介绍。目前,Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、Spark Streaming、GraphX、MLlib等子项目,本章只进行简要介绍,后续章…...

基于SpringBoot + Vue的基于Web的跳蚤市场管理系统

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 &#x1f49b;博主介绍&#…...