日期问题---算法精讲

前言

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

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

                   


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

欢迎留言喔,谢谢大家! 

 

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

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

相关文章

人工智能|机器学习——K-means系列聚类算法k-means/ k-modes/ k-prototypes/ ......(划分聚类)

1.k-means聚类 1.1.算法简介 K-Means算法又称K均值算法&#xff0c;属于聚类&#xff08;clustering&#xff09;算法的一种&#xff0c;是应用最广泛的聚类算法之一。所谓聚类&#xff0c;即根据相似性原则&#xff0c;将具有较高相似度的数据对象划分至同一类簇&#xff0c;…

CentOS 7.6安装部署Seafile服务器

今天飞飞和你们分享CentOS 7.6上安装基于MySQL/MariaDB的Seafile服务器的方法&#xff0c;包括下载和安装7.0.5版本、配置数据库、启动服务器等步骤。安装成功后&#xff0c;需要通过nginx反向代理才能访问seafile服务。 通过预编译好的安装包来安装并运行基于 MySQL/MariaDB …

Day27:安全开发-PHP应用TP框架路由访问对象操作内置过滤绕过核心漏洞

目录 TP框架-开发-配置架构&路由&MVC模型 TP框架-安全-不安全写法&版本过滤绕过 思维导图 PHP知识点 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框架开发等 技…

网络触手获取天气数据存入mysql 项目

首先这个案例不一定能直接拿来用&#xff0c;虽然我觉得可以但是里面肯定有一些我没考虑到的地方。 有问题评论或者私信我&#xff1a; 这个案例适合我这种学生小白 获取天气数据网址&#xff1a; https://lishi.tianqi.com/xianyang/202201.html 网络触手获取天气数据代码直…

Svg Flow Editor 原生svg流程图编辑器(二)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; 说明 这项目也是我第一次写TS代码哈&#xff0c;现在还被绕在类型中头昏脑胀&#xff0c;更新可能会慢点&#xff0c;大家见谅~ 目前实现的功能&#xff1a;1. 元件的创建、移动、形变&#xff1b;2…

运动想象 (MI) 迁移学习系列 (3) : MSFT

运动想象迁移学习系列:MSFT 0. 引言1. 主要贡献2. 数据增强方法3. 基于度量的空间滤波转换器3.1 空间过滤3.2 脑电图ViT3.2.1 变压器编码器层3.2.2 基于度量的损失函数 4. 实验结果4.1 消融实验4.2 基线任务对比4.3 跨主题 5. 总结欢迎来稿 论文地址&#xff1a;https://www.s…

深入浅出计算机网络 day.1 概论② 因特网概述

当你回头看的时候&#xff0c;你会发现自己走了一段&#xff0c;自己都没想到的路 —— 24.3.9 内容概述 01.网络、互连&#xff08;联&#xff09;网与因特网的区别与联系 02.因特网简介 一、网络、互连&#xff08;联&#xff09;网与因特网的区别与联系 1.若干节点和链路互连…

Java 客户端向服务端上传文件(TCP通信)

一、实验内容 编写一个客户端向服务端上传文件的程序&#xff0c;要求使用TCP通信的的知识&#xff0c;完成将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文件名&#xff0c;即IP&#xff08;count&#…

excel统计分析——嵌套设计

参考资料&#xff1a;生物统计学&#xff0c;巢式嵌套设计的方差分析 嵌套设计&#xff08;nested design&#xff09;也称为系统分组设计或巢式设计&#xff0c;是把试验空间逐级向低层次划分的试验设计方法。与裂区设计相似&#xff0c;先按一级因素设计试验&#xff0c;然后…

Linux网络套接字之预备知识

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、预备知识 1.理解源IP地址和目的IP地址 …

真实案例分享:MOS管电源开关电路,遇到上电冲击电流超标

做硬件&#xff0c;堆经验。 分享一个案例&#xff1a;MOS管电源开关电路&#xff0c;遇到上电冲击电流超标&#xff0c;怎么解决的呢&#xff1f; 下面是正文部分。 —— 正文 —— 最近有一颗用了挺久的MOSFET发了停产通知&#xff0c;供应链部门找到我们研发部门&#xff0c…

RabbitMQ发布确认高级版

1.前言 在生产环境中由于一些不明原因&#xff0c;导致 RabbitMQ 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递呢&…

C++——string模拟实现

前言&#xff1a;上篇文章我们对string类及其常用的接口方法的使用进行了分享&#xff0c;这篇文章将着重进行对这些常用的接口方法的内部细节进行分享和模拟实现。 目录 一.基础框架 二.遍历字符串 1.[]运算符重载 2.迭代器 3.范围for 三.常用方法 1.增加 2.删除 3.调…

spring boot 2.4.x 之前版本(对应spring-cloud-openfeign 3.0.0之前版本)feign请求异常逻辑

目录 feign SynchronousMethodHandler 第一部分 第二部分 第三部分 spring-cloud-openfeign LoadBalancerFeignClient ribbon AbstractLoadBalancerAwareClient 在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 因为从 spring …

Excel F4键的作用

目录 一. 单元格相对/绝对引用转换二. 重复上一步操作 一. 单元格相对/绝对引用转换 ⏹ 使用F4键 如下图所示&#xff0c;B1单元格引用了A1单元格的内容。此时是使用相对引用&#xff0c;可以按下键盘上的F4键进行相对引用和绝对引用的转换。 二. 重复上一步操作 ⏹添加或删除…

【Python】装饰器函数

专栏文章索引&#xff1a;Python 原文章&#xff1a;装饰器函数基础_装饰函数-CSDN博客 目录 1. 学习装饰器的基础 2.最简单的装饰器 3.闭包函数装饰器 4.装饰器将传入的函数中的值大写 5. 装饰器的好处 6. 多个装饰器的执行顺序 7. 装饰器传递参数 8. 结语 1. 学习装饰…

c++中string的模拟实现(超详细!!!)

1.string的成员变量、&#xff08;拷贝&#xff09;构造、析构函数 1.1.成员变量 private:char* _str;size_t _size; //string中有效字符个数size_t _capacity; //string中能存储有效字符个数的大小 1.2&#xff08;拷贝&#xff09;构造函数 //构造函数string(const char* …

Chain of Verification(验证链、CoVe)—理解与实现

原文地址&#xff1a;Chain of Verification (CoVe) — Understanding & Implementation 2023 年 10 月 9 日 GitHub 存储库 介绍 在处理大型语言模型&#xff08;LLM&#xff09;时&#xff0c;一个重大挑战&#xff0c;特别是在事实问答中&#xff0c;是幻觉问题。当答案…

React-路由导航

1.声明式路由导航 1.1概念 说明&#xff1a;声明式导航是指通过在模版中通过<Link/>组件描述出要跳转到哪里去&#xff0c;比如后台管理系统的左侧菜单通常使用这种方式进行。 import {Link} from "react-router-dom" const Login()>{return (<div>…

资源哟正版无授权模版源码(含搭建教程)

资源哟 v1.3 – 新增两种首页布局 – 新增幻灯片插件 – 优化深色模式颜色效果 – 优化导航页面左侧栏目跳转效果 – 优化后台辅助插件当前页面打开 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88898100 更多资源下载&#xff1a;关注我。