日期问题---算法精讲

前言

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

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

                   


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

欢迎留言喔,谢谢大家! 

 

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

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

相关文章

万字完整版【C语言】指针详解~

一、前言 初始指针&#xff08;0&#xff09;&#xff1a;着重于讲解指针的概念、基本用法、注意事项、以及最后如何规范使用指针深入指针&#xff08;1&#xff09;&#xff1a;讲解指针变量常见的类型&#xff0c;如何去理解这些类型、最后就是如何正确的使用深入指针&#…

【sgExcelGrid】自定义组件:简单模拟Excel表格拖拽、选中单元格、横行、纵列、拖拽圈选等操作

特性&#xff1a; 可以自定义拖拽过表格可以点击某个表格&#xff0c;拖拽右下角小正方形进行任意方向选取单元格支持选中某一行、列支持监听selectedGrids、selectedDatas事件获取选中项的DOM对象和数据数组支持props自定义显示label字段别名 sgExcelGrid源码 <template&g…

Swift 入门学习:集合(Collection)类型趣谈-下

概览 集合的概念在任何编程语言中都占有重要的位置&#xff0c;正所谓&#xff1a;“古来聚散地&#xff0c;宿昔长荆棘&#xff1b;游人聚散中&#xff0c;一片湖光里”。把那一片片、一瓣瓣、一粒粒“可耐”的小精灵全部收拢、吸纳的井然有序、条条有理&#xff0c;怎能不让…

React Three Fiber快速入门

https://threejs-journey.com/lessons/what-are-react-and-react-three-fiber#学习笔记 1.基础知识 resize 填充模版 构建第一个场景 we didn’t have to create a scenewe didn’t have to create the webglrenderthe scene is being rendered on each framethe default…

ubuntu23.10安装搜狗拼音

1.添加fcitx仓库 sudo add-apt-repository ppa:fcitx-team/nightly 更新: sudo apt-get update 安装fcitx sudo apt-get install fcitx fcitx安装成功 切换输入系统为fcitx

知识碎片收集

目录 1. 如何计算两点经纬度之间的距离2. 加权随机采样3.什么时LLDB和GDB 1. 如何计算两点经纬度之间的距离 1.知乎-如何计算两点经纬度间距离 2.根据两点经纬度坐标计算距离 3.根据经纬度计算两点之间的距离的公式推导过程以及google.maps的测距函数 4.根据经纬度点计算经…

『python爬虫』formhash 与 跨站请求伪造(CSRF)攻击

目录 1. 什么是跨站请求伪造&#xff08;CSRF&#xff09;攻击?2. 防御 CSRF 攻击的措施3. 在爬虫反爬中的具体应用 - formhash总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 1. 什么是跨站请求伪造&#xff…

rust引用-借用机制扩展

rust引用-借用机制还是有限制的&#xff0c;比如我们要在多次函数调用中修改参数、跨线程传递参数并发修改的场景&#xff0c;单纯使用引用-借用机制就不灵了&#xff08;这种场景和引用-借用功能是冲突的&#xff09;。这时需要借助rust提供的Rc、Arc、Cell、RefCell对机制来扩…

【C语言】tcp_transmit_skb

一、__tcp_transmit_skb讲解 这个函数 __tcp_transmit_skb() 是 Linux 内核中 TCP/IP 协议栈的一部分&#xff0c;负责处理传输控制协议&#xff08;TCP&#xff09;数据包的发送。具体来说&#xff0c;这个函数将 TCP 头部添加到一个没有任何头部信息的 socket buffer (sk_bu…

计算机网络 路由算法

路由选择协议的核心是路由算法&#xff0c;即需要何种算法来获得路由表中的各个项目。 路由算法的目的很明显&#xff0c;给定一组路由器以及连接路由器的链路&#xff0c;路由算法需要找到一条从源路由器到目的路由器的最佳路径&#xff0c;通常&#xff0c;最佳路径是由最低…

Yocto - Project Quick Build

欢迎光临&#xff01; 这篇简短的文档将向您介绍使用 Yocto 项目构建典型镜像的过程。本文还介绍了如何为特定硬件配置构建。您将使用 Yocto Project 构建一个名为 Poky 的参考嵌入式操作系统。 Welcome! This short document steps you through the process for a typical i…

Diddler抓包工具——学习笔记

F12抓包 302【重定向】&#xff1a;当你发送了一个请求之后&#xff0c;那么这个请求重定向到了另外的资源 跳转和重定向的区别&#xff1a; 跳转是会把数据传到新的地址 重定向不会把新的数据传到新的地址 使用F12抓包时一定要打开Preserve Log开关&#xff0c;作用是保留…

c#开发100问?

什么是C#&#xff1f;C#是由谁开发的&#xff1f;C#与Java之间有哪些相似之处&#xff1f;C#与C有哪些不同之处&#xff1f;C#的主要特性是什么&#xff1f;请解释C#中的类和对象。C#中的命名空间是什么&#xff1f;什么是C#中的属性和字段&#xff1f;请解释C#中的继承和多态性…

万用表数据导出变化曲线图——pycharm实现视频数据导出变化曲线图

万用表数据导出变化曲线图——pycharm实现视频数据导出变化曲线图 一、效果展示二、环境配置三、代码构思四、代码展示五、代码、python环境包链接 一、效果展示 图1.1 效果展示 &#xff08;左图&#xff1a;万用表视频截图&#xff1b;右图&#xff1a;表中数据变化曲线图&am…

Springboot整合Mybaits启动过程

Springboot整合Mybaits启动过程 1.前言2.MybatisAutoConfiguration3.SqlSessionFactoryBean3.1 XMLConfigBuilder.parse()3.1.1 XMLMapperBuilder.parse()3.1.1.1 XMLStatementBuilder.parse() 4.SqlSession4.1 Executor 1.前言 直接加载mybatis配置文件&#xff0c;然后创建S…

Oracle 数据库sysaux表空间

导读 Oracle数据库中的SYSAUX表空间是一个特殊的表空间&#xff0c;它是在Oracle数据库10g版本中引入的。SYSAUX表空间用于存储数据库的辅助系统数据和附加组件数据&#xff0c;旨在减轻System表空间的负担&#xff0c;使得数据库管理更加高效。在本文中&#xff0c;我们将深入…

Matlab|【EI复现】电动汽车集群并网的分布式鲁棒优化调度模型

目录 1 内容简介 2 关键知识点 2.1 三类电动汽车模型 3 程序结果 4 下载链接 1 内容简介 电动汽车的数据模型种类繁多&#xff0c;但是用到比较高阶数学方法的并不多&#xff0c;本次分享的程序是下图所示的文章。 采用分布鲁棒优化模型&#xff0c;用到鲁棒对等转换&…

贪心区间问题(区间选点)

题目 给定 N 个闭区间 [ai,bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N&#xff0c;表示区间数。 接下来 N 行&#xff0c;每行…

开发指南002-前后端信息交互规范-请求类

请求类由org.qlm.io.vo.RequestInfo定义&#xff1a;//1.0 Schema(description "平台-请求包版本标识 用于版本兼容") private String version;Schema(description "平台-请求者") private String consumer;//请求者 标识发出请求的系统Schema(descripti…

MyBatis3源码深度解析(七)JDBC单连接事务

文章目录 前言2.7 JDBC单连接事务2.7.1 事务的开启与提交2.7.2 事务隔离级别2.7.2.1 并发访问问题&#xff08;1&#xff09;脏读&#xff08;2&#xff09;不可重复读&#xff08;3&#xff09;幻读 2.7.2.2 事务隔离级别&#xff08;1&#xff09;TRANSACTION_NONE&#xff1…