【蓝桥杯基础题】2020年省赛填空题—回文日期

news2025/1/10 7:53:13

在这里插入图片描述

  • 👑专栏内容:蓝桥杯刷题
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录

  • 一、题目背景
  • 二、题目描述
    • 1.问题描述
    • 2.输入格式
    • 3.输出格式
    • 4.一个例子
    • 5. 评测用例规模与约定
  • 三、题目分析
    • 1.获取位数
    • 2.回文检查
      • 检查第一种回文日期
      • 检查第二种回文日期
    • 3.枚举限制
      • 进行日期限制
  • 四、代码汇总
    • 1.C语言代码
    • 2. C++代码
  • 五、总结
    • 1.回文判断
    • 2.日期判断


一、题目背景

本题为2020年省赛填空题

  • C/C++A组第7题
  • C/C++B组第7题
  • Java A组第7题

二、题目描述

1.问题描述

2020 年春节期间,有一个特殊的日期引起了大家的注意: 2020 年 2 月 2日。因为如果将这个日期按“yyyymmdd”的格式写成一个 8 位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。

有人表示 20200202 是“千年一遇”的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期: 202112022021年12月2日
也有人表示20200202 并不仅仅是一个回文日期,还是一个 ABABBABA型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个ABABBABA 型的回文日期: 21211212 2121 年12月12日。算不上“千年一遇”,顶多算“千年两遇”。

给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA 型的回文日期冬是哪一天。

2.输入格式

输入包含一个八位整数 N,表示日期。

3.输出格式

输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下个 ABABBABA 型的回文日期。

4.一个例子

下面是一个样例
输入:
20200202

输出:

20211202
21211212

5. 评测用例规模与约定

对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的8位数表示。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

三、题目分析

和2021省赛的卡片题目一样,如果我们有办法将所有回文日期的八位数全部枚举出来,是不是就可以解决问题了呢?现在问题就转化为:怎样枚举和怎样检查。
我们仔细观察一下两种回文日期的格式。
第一种:20211202
第二种:21211212
我们可以设置下标从0~7的数组,代表日期的每一位数字的大小。
那么对于第一种回文日期,只需要满足如下条件

a[0]==a[7];
a[1]==a[6];
a[2]==a[5];
a[3]==a[4];

对于第二种回文日期(ABABBABA型),只需要满足如下条件

a[0]==a[2]==a[5]==a[7];
a[1]==a[3]==a[4]==a[6];

1.获取位数

利用取余的方法获取每一位的位数,如果不会的可以看下2021省赛-卡片。

//获取日期每一位的位数
void digit(int date, int a[],int N)
{
	for (int i = 0; i < N; i++)
	{
		a[N - 1 - i] = date % 10;
		date = date / 10;
	}
}

2.回文检查

依旧以C语言写回文日期的检查代码。
注意:C语言中没有bool类型和String类型。
C++代码也会放在后面,但是整体思路一样。

检查第一种回文日期

int check_1(int a[])
{
	if (a[0] == a[7] && a[1] == a[6] && 
		a[2] == a[5] && a[3] == a[4])
		return 1 ;
	return 0;
}

检查第二种回文日期

int check_2(int a[])
{
	if (a[0] == a[2]&& a[0] == a[5] && a[0] == a[7] && 
		a[1] == a[3]&& a[1] == a[4] && a[1] == a[6])
		return 1 ;
	return 0;
}

3.枚举限制

可能会有很多人写出下面的枚举情况

	int input;
	scanf("%8d",&input);
	for (int i = input; i <= 89991231; i++)
	{
		digit(i, a,8);
		if (check_1(a) || check_2(a))
			printf("%d\n",i);
	}

其实这样确实可以枚举出答案,但是,这样枚举不符合题目的标准。并且也会枚举出大量不是日期但符合回文标准的数字。
所以,我们应该对枚举的数也进行检查,要求限制它必须为有效的年月日。
在这里插入图片描述

进行日期限制

一年只有12个月,每个月的天数都不同,所以可以用12个数组来模拟每一个月的天数,这样只需要判断月份是不是属于1~12,天数是不是符合当前月份的天数。
但是,这里 有个小坑,那就是闰年!闰年的二月天数是29天,而不是28天。

int check_3(int a[])
{
	int day[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };	//(1)
	int y = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];		//(2)
	int m = a[4] * 10 + a[5];									//(3)
	int d = a[6] * 10 + a[7];									//(4)
	if ((0 == y % 4 && y % 100 != 0) || (0 == y % 400))			//(5)
	{
		day[1] = 29;											//(6)
	}
	else
	{
		day[1] = 28;											//(7)
	}
	if ( m>12||m< 1 || d<1 || d>day[m])							//(8)
		return 0;
	return 1;
}
  • (1)定义每个月的天数
  • (2)计算年份
  • (3)计算月份
  • (4)计算第几天
  • (5)判断是不是闰年
  • (6)闰年二月天数为29
  • (7)非闰年二月天数为28
  • (8)判断是不是符合日期标准

四、代码汇总

1.C语言代码

#include <stdio.h>
//获取日期的位数
void digit(int date, int a[], int N)
{
	for (int i = 0; i < N; i++)
	{
		a[N - 1 - i] = date % 10;
		date = date / 10;
	}
}
int check_1(int a[])
{
	if (a[0] == a[7] && a[1] == a[6] && a[2] == a[5] && a[3] == a[4])
		return 1;
	return 0;
}
int check_2(int a[])
{
	if (a[0] == a[2] && a[0] == a[5] && a[0] == a[7] && a[1] == a[3] && a[1] == a[4] && a[1] == a[6])
		return 1;
	return 0;
}
int check_3(int a[])
{
	int day[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
	int y = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
	int m = a[4] * 10 + a[5];
	int d = a[6] * 10 + a[7];
	if ((0 == y % 4 && y % 100 != 0) || (0 == y % 400))
	{
		day[1] = 29;
	}
	else
	{
		day[1] = 28;
	}
	if (m > 12 || m < 1 || d<1 || d>day[m])
		return 0;
	return 1;
}
int main()
{
	int a[8];
	int input, a1 = 0, a2 = 0;
	scanf("%8d", &input);
	int i = input + 1;
	for (int i = input + 1; i <= 89991231; i++)
	{
		digit(i, a,8);
		if (check_1(a) && check_3(a))
		{
			a1 = i;
			break;
		}
	}
	for (int i = input + 1; i <= 89991231; i++)
	{
		digit(i, a,8);
		if (check_2(a) && check_3(a))
		{
			a2 = i;
			break;
		}
	}
	printf("%d\n%d", a1, a2);
	return 0;
}

2. C++代码

C++里面有很多C语言没有的东西。
比如: string类型
有了这个类型,玩的花样就多了不少。
同时 to_string 可以将数字常量转换为字符串,返回值为转换完毕的字符串。

#include<iostream>
#include<cstdio>
#include<string>
using namespace  std;
bool check_1(int date)
{
	string a = to_string(date);
	if (a[0] == a[7] && a[1] == a[6] && a[2] == a[5] && a[3] == a[4])
		return true;
	return false;
}
bool check_2(int date)
{
	string a = to_string(date);
	if (a[0] == a[2] && a[0] == a[5] && a[0] == a[7] &&
		a[1] == a[3] && a[1] == a[4] && a[1] == a[6])
		return true;
	return false;
}
bool check_3(int date)
{
	int day[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
	int y = date / 10000, m = date / 100 % 100, d = date % 100;
	if ((0 == y % 4 && y % 100 != 0) || (0 == y % 400))
	{
		day[1] = 29;
	}
	else
	{
		day[1] = 28;
	}
	if (m > 12 || m < 1 || d<1 || d>day[m])
		return false;
	return true;
}
int main()
{
	int day[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
	int date, a1, a2;
	scanf("%8d", &date);
	for (int i = date + 1; i <= 89991231; i++)
	{
		if (check_1(i) && check_3(i))
		{
			a1 = i;
			break;
		}
	}
	for (int i = date + 1; i <= 89991231; i++)
	{
		if (check_2(i) && check_3(i))
		{
			a2 = i;
			break;
		}
	}
	cout << a1 << endl << a2;
	return 0;
}

五、总结

1.回文判断

回文都是对称结构,只需要让对称的部分相等就行了。
打个比方:人人为我我为人人
这句话就是对称的。
如果对称的部分相等,那么就满足了回文的要求。

bool check_1(int date)
{
	string a = to_string(date);
	if (a[0] == a[7] && a[1] == a[6] && 
		a[2] == a[5] && a[3] == a[4])
		return true;
	return false;
}

2.日期判断

注意:判断是不是合法日期有个小坑,那就是闰年!
闰年的二月天数是29天,而不是28天。

此时就涉及到了,闰年的判断方法。
对于日期的判断,我们可以记住下面这段代码。

bool check_3(int date)
{
	int day[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
	int y = date / 10000, m = date / 100 % 100, d = date % 100;
	if ((0 == y % 4 && y % 100 != 0) || (0 == y % 400))
	{
		day[1] = 29;
	}
	else
	{
		day[1] = 28;
	}
	if (m > 12 || m < 1 || d<1 || d>day[m])
		return false;
	return true;
}

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

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

相关文章

236页10万字精选数据中台建设方案2022版

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目录 1. 数据中台平台建设方案 …

数据存储大小端 网络字节序

一、概念 大端模式&#xff1a;数据的低位存放在内存的高地址中 小端模式&#xff1a;数据的低位存放在内存的低地址中 二、数据的高低位 首先需要清楚一段数据存储高低位区分 联想记忆最右边为16^0 下来16^1 比如下图二进制为例&#xff1a; 三、内存的高低位 以vs2019为…

JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配

文章目录前言一、排序规范1、happens-before原则2、找文档位置二、对象创建的过程&#xff08;后面回答的就是这几个问题&#xff09;1、一线互联网企业面试题&#xff1a; 关于对象2、对象创建过程三、对象在内存中的存储布局1、1.8版本虚拟机配置2、对象的内存布局a、普通对象…

字节三面:如何设计一个高并发系统

前言 大家好&#xff0c;我是田螺。 记得很久之前&#xff0c;去面试过字节跳动。被三面的面试官问了一道场景设计题目&#xff1a;如何设计一个高并发系统。当时我回答得比较粗糙&#xff0c;最近回想起来&#xff0c;所以整理了设计高并发系统的15个锦囊&#xff0c;相信大…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + 万集716 单线激光 测试

简介&#xff1a;介绍 万集716 单线激光 在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX1里已经安装了ROS版本&#xff1a;Melodic。关于测试…

三、k8s资源管理

文章目录1 k8s资源管理介绍2 YAML语言介绍3 资源管理方式3.1 命令式对象管理3.2 命令式对象配置3.3 声明式对象配置3.4 如何编写YAML1 k8s资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质…

MySQL字符集和排序规则详解

一. 相关概念1. 字符集MySQL提供了多种字符集和排序规则选择&#xff0c;其中字符集设置和数据存储以及客户端与MySQL实例的交互相关&#xff0c;排序规则和字符串的对比规则相关(1). 字符集的设置可以在MySQL实例、数据库、表、列四个级别(2). MySQL设置字符集支持在InnoDB, M…

Git学习:工作流学习实践

文章目录一、前言二、开发过程一、前言 在实践的项目开发过程中&#xff0c;会使用Git或者类似的版本控制工具来管理代码。下面介绍基于Git工具在实际项目开发过程中的使用流程。 如上图所示显示了项目开发的一个简化流程。在开发一个新需求/版本的时候&#xff0c;一般会从主…

筛法求欧拉函数

欧拉函数的定义 在数论中&#xff0c;对正整数n&#xff0c;欧拉函数是小于n的正整数中与n互质的数的数目. 欧拉函数的重要性质 若(即m与n互质)&#xff0c;则若为质数&#xff0c;则若为质数&#xff0c;则对于性质2&#xff0c;若为质数&#xff0c;则小于的个数都互质&am…

北大陈斌Python算法笔记(二)

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1f342;不就是蓝桥杯嘛&#xff0c;干他&#xff01;&#xff01;我堂堂 栈的应用&#xff1a;简单括号匹…

docker安装nginx与容器之间的互相通信

目录 1. docker网络模式 2. 连接容器的三种方法 3. Docker Networking 3.1 创建网络 3.2 查看宿主机中创建的网络 3.3 删除网络 3.4 如何使用网络 4.搭建Nginx 1.准备工作 1.1 拉取镜像 ​编辑1.2 在宿主机中创建挂载目录 2.准备2个tomcat 容器集群 3.准备 Nginx配…

力扣(LeetCode)1658. 将 x 减到 0 的最小操作数(C++/Python)

题目描述 逆向思维滑动窗口 题目分析 &#xff1a; 从数组左侧和右侧&#xff0c;取出左侧的连续数字&#xff0c;右侧的连续数字&#xff0c;使得这些数字之和等于 x&#xff0c;维护最小取数次数&#xff0c;作为答案 。 设整个数组之和 total &#xff0c;除去左侧和右侧的…

Notes 12.0.2版本新特性

大家好&#xff0c;才是真的好。 随着上周代号多瑙河的Notes/Domino 12.0.2版本正式发布&#xff0c;很多人在周末加班&#xff0c;写新特性和功能测试文档等&#xff0c;恩&#xff0c;我也是这样&#xff0c;所以今天第一时间来介绍下Notes 12.0.2客户机新特性。 从12.0.2版…

GC中的一些技术

OopMap&#xff08;ordinary object pointer map&#xff09; 记录时机 JIT编译时在特定的位置&#xff08;安全点/安全区&#xff09;记录下OopMap&#xff0c;记录了执行到该方法的某条指令的时候&#xff0c;栈上和寄存器里哪些位置是引用类加载动作完成时&#xff0c;Hot…

关于sql注入这一篇就够了

本文章根据b站迪总课程总结出来,若有不足请见谅 目录 本文章根据b站迪总课程总结出来,若有不足请见谅 存在sql注入条件 判断数据库类型 注入mysql思路 判断网站是否存在注入点 判断列名数量&#xff08;字段数&#xff09; 文件读写操作 网站路径获取方法 注入类型 按注入点数据…

Linux物理内存:伙伴系统(buddy system)

引入之前写过一篇文章将伙伴系统&#xff0c;可以参考&#xff1a;内存池算法简介从上面的虚拟机上可以看到&#xff0c;X86系统上&#xff0c;有三个物理内存区&#xff0c;DMA&#xff0c;DMA32&#xff0c;Normal&#xff0c;可以看到阶数为11。struct page {atomic_t _mapc…

J DBC相关

JDBC基础什么是JDBC入门程序功能类工具类SQL注入攻击原理PreparedStatement的介绍数据库连接池原理自定义连接池归还连接JDBC框架自定义JDBC框架JDBC基础 什么是JDBC 用于执行SQL语句的java API&#xff0c;实现不同关系型数据库的连接 入门程序 导入jar包 注册驱动 获取连…

Linux驱动开发基础__gpio子系统重要概念

目录 1 引入 2 在设备树中指定引脚 3 在驱动代码中调用GPIO子系统 4 sysfs 中的访问方法 1 引入 要操作 GPIO 引脚&#xff0c;先把所用引脚配置为 GPIO 功能&#xff0c;这通过 Pinctrl 子系统来实现。 然后就可以根据设置引脚方向(输入还是输出)、读值──获得电平状…

Windows Docker Desktop开放API端口2375用于远程调用

Windows Docker Desktop开放API端口2375用于远程调用问题解决开启IP Helper服务开启Docker配置开放2375端口端口映射找到需要暴露的IP执行端口映射命令Windows防火墙关闭防火墙添加防火墙规则测试问题 Windows Docker Desktop为了安全&#xff0c;默认设置中只有localhost:237…

入门的葡萄酒知识

葡萄酒的分类&#xff08;根据制造方法&#xff09; 静态葡萄酒 红葡萄酒 Red Wine&#xff0c;白葡萄酒 White Wine&#xff0c;玫瑰红/桃红/粉红葡萄Rose Wine。 气泡&#xff08;起泡&#xff09;葡萄酒 有气泡的葡萄酒&#xff0c;分香槟Champagne及气泡葡萄酒两类。只有在…