【蓝桥杯】43693.日期问题

news/2025/1/23 23:48:43/

题目描述

  小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

  更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。

  给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入描述

一个日期,格式是 “AA/BB/CC” (0≤A,B,C≤9)。

输出描述

  输出若干个不相同的日期,每个日期一行,格式是 “yyyy−MM−dd”。多个日期按从早到晚排列。

输入输出样例

示例

输入:

02/03/04

输出:

2002-03-04
2004-02-03
2004-03-02

题目分析

  比较简单,无非就是分情况讨论而已。第一种情况:"年 / 月 / 日"的格式;第二种情况:"月 / 日 / 年"的格式;第三种情况:"日 / 月 / 年"的格式;
  年份的区间在1960年至2059年,跨度100年,其中 y e a r year year >= 60的,是19开头的年份, y e a r year year < 60的,是20开头的年份;月份的区间在01月到12月;日期的区间在01日到31日。根据输入的字符串,做拆分之后,寻找可能的组合即可。
  但是有几个限制规则需要注意:

  1. 2月没有30日和31日,闰年可以有29日,不是闰年只有01-28日。
  2. 对于 4、6、9、11 月的天数不能超过 30 天。

代码实现

感谢 @练洋洋 同学提供的代码。不过在这个版本的代码中没有判断闰年和判断单双月最后一天的功能。

python">import os
import sys
import datetimedef is_valid_date(year, month, day):"""此函数用于判断输入的年、月、日是否为有效的日期,并检查是否在 1960 年 1 月 1 日至 2059 年 12 月 31 日之间:param year: 年份:param month: 月份:param day: 日期:return: 若为有效日期且在指定范围内返回 True,否则返回 False"""try:# 使用 datetime.date 类尝试创建日期对象date = datetime.date(year, month, day)# 检查日期是否在 1960 年 1 月 1 日至 2059 年 12 月 31 日之间if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return False# 若输入的年、月、日组合不合法会引发 ValueError 异常except ValueError:return False# 从标准输入读取日期字符串,并使用 map 函数将其按 / 分割并转换为整数存储在 a, b, c 中
a, b, c = map(int, input().split('/'))
# 存储满足条件的日期元组列表
dates = []# 假设日期格式为年/月/日
if 1 <= b <= 12 and 1 <= c <= 31:# 如果年份前两位大于等于 60,则年份是 19xx 年if a >= 60:# 调用 is_valid_date 函数判断日期是否有效if is_valid_date(1900 + a, b, c):dates.append((1900 + a, b, c))# 否则年份是 20xx 年else:if is_valid_date(2000 + a, b, c):dates.append((2000 + a, b, c))# 假设日期格式为月/日/年
if 1 <= a <= 12 and 1 <= c <= 31:# 对年份的处理,根据 c 的大小判断是 19xx 年还是 20xx 年if c >= 60:if is_valid_date(1900 + c, a, b):dates.append((1900 + c, a, b))else:if is_valid_date(2000 + c, a, b):dates.append((2000 + c, a, b))# 假设日期格式为日/月/年
if 1 <= a <= 31 and 1 <= b <= 12:# 对年份的处理,根据 c 的大小判断是 19xx 年还是 20xx 年if c >= 60:if is_valid_date(1900 + c, b, a):dates.append((1900 + c, b, a))else:if is_valid_date(2000 + c, b, a):dates.append((2000 + c, b, a))# 对 dates 列表去重
dates = list(set(dates))
# 对日期列表进行排序,排序依据是元组中的元素,即年、月、日
dates.sort()
# 遍历排序后的日期列表,将其按照指定格式输出
for date in dates:print('{:04d}-{:02d}-{:02d}'.format(date[0], date[1], date[2]))

修改之后的代码,加入了非闰年天数不超过28天以及部分月份天数不能超过 30 天的限制,要更加合理一些:

python">import os
import sys
import datetimedef is_valid_date(year, month, day):"""此函数用于判断输入的年、月、日是否为有效的日期,并检查是否在 1960 年 1 月 1 日至 2059 年 12 月 31 日之间:param year: 年份:param month: 月份:param day: 日期:return: 若为有效日期且在指定范围内返回 True,否则返回 False"""# 定义大月的月份集合big_months = {1, 3, 5, 7, 8, 10, 12}# 定义小月的月份集合small_months = {4, 6, 9, 11}try:if month == 2:# 判断是否为闰年if (year % 4 == 0 and year % 100!= 0) or (year % 400 == 0):if 1 <= day <= 29:date = datetime.date(year, month, day)if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return Falseelse:if 1 <= day <= 28:date = datetime.date(year, month, day)if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return Falseelif month in big_months:if 1 <= day <= 31:date = datetime.date(year, month, day)if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return Falseelif month in small_months:if 1 <= day <= 30:date = datetime.date(year, month, day)if datetime.date(1960, 1, 1) <= date <= datetime.date(2059, 12, 31):return Trueelse:return Falseelse:return Falseexcept ValueError:return Falsedef main():# 从标准输入读取日期字符串,并使用 map 函数将其按 / 分割并转换为整数存储在 a, b, c 中a, b, c = map(int, input().split('/'))# 存储满足条件的日期元组列表dates = []# 假设日期格式为年/月/日if 1 <= b <= 12 and 1 <= c <= 31:# 如果年份前两位大于等于 60,则年份是 19xx 年if a >= 60:# 调用 is_valid_date 函数判断日期是否有效if is_valid_date(1900 + a, b, c):dates.append((1900 + a, b, c))# 否则年份是 20xx 年else:if is_valid_date(2000 + a, b, c):dates.append((2000 + a, b, c))# 假设日期格式为月/日/年if 1 <= a <= 12 and 1 <= c <= 31:# 对年份的处理,根据 c 的大小判断是 19xx 年还是 20xx 年if c >= 60:if is_valid_date(1900 + c, a, b):dates.append((1900 + c, a, b))else:if is_valid_date(2000 + c, a, b):dates.append((2000 + c, a, b))# 假设日期格式为日/月/年if 1 <= a <= 31 and 1 <= b <= 12:# 对年份的处理,根据 c 的大小判断是 19xx 年还是 20xx 年if c >= 60:if is_valid_date(1900 + c, b, a):dates.append((1900 + c, b, a))else:if is_valid_date(2000 + c, b, a):dates.append((2000 + c, b, a))# 对 dates 列表去重dates = list(set(dates))# 对日期列表进行排序,排序依据是元组中的元素,即年、月、日dates.sort()# 遍历排序后的日期列表,将其按照指定格式输出for date in dates:print('{:04d}-{:02d}-{:02d}'.format(date[0], date[1], date[2]))if __name__ == "__main__":main()

http://www.ppmy.cn/news/1565617.html

相关文章

26. 【.NET 8 实战--孢子记账--从单体到微服务】--需求更新--用户注销、修改用户名、安全设置

在实际开发过程中&#xff0c;项目需求的变更和增加是常见的情况&#xff0c;因此这篇文章我们就模拟一下项目需求新增的情况。 一、需求 项目经理今天提出了新的功能&#xff0c;需要增加重置密码、安全设置、修改用户名、注销账户这四个功能&#xff0c;这四个功能必须是独…

OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?

OpenEuler与CentOS的对比 一、基本信息 起源与背景&#xff1a; OpenEuler&#xff1a;由华为发起&#xff0c;后捐赠给开放原子开源基金会&#xff0c;旨在构建一个开放、多元化的云计算和边缘计算平台&#xff0c;以满足华为及其他企业的硬件和软件需求。CentOS&#xff1a;…

MySQL入门(数据库、数据表、数据、字段的操作以及查询相关sql语法)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

RabbitMQ---事务及消息分发

&#xff08;一&#xff09;事务 RabbitMQ是基于AMQP协议实现的&#xff0c;该协议实现了事务机制&#xff0c;所以RabbitMQ也支持事务机制&#xff0c;他的事务允许开发者确保消息的发送和接收时原子性的&#xff0c;要么全部成功&#xff0c;要么全部失败 我们设置事务有三步…

记一次为centos7更换yum源成功

按照网络教程下载或编辑新的源&#xff0c;如阿里、清华大学的源等等&#xff1b; 将新的源文件替换目录/etc/yum.repos.d/下的文件CentOS-Base.repo&#xff1b; 按照网络教程&#xff0c;下面的步骤操作出现了问题&#xff1a; yum clean all yum makecache yum makecache命令…

MECD+: 视频推理中事件级因果图推理--VLM长视频因果推理

论文链接&#xff1a;https://arxiv.org/pdf/2501.07227v1 1. 摘要及主要贡献点 摘要&#xff1a; 视频因果推理旨在从因果角度对视频内容进行高层次的理解。然而&#xff0c;目前的研究存在局限性&#xff0c;主要表现为以问答范式执行&#xff0c;关注包含孤立事件和基本因…

mysql数据被误删的恢复方案

文章目录 一、使用备份恢复二、使用二进制日志&#xff08;Binary Log&#xff09;三、使用InnoDB表空间恢复四、使用第三方工具预防措施 数据误删是一个严重的数据库管理问题&#xff0c;但通过合理的备份策略和使用适当的恢复工具&#xff0c;可以有效地减少数据丢失的风险…

Go channel关闭方法

channel关闭原则 1、不能在消费端关闭channel&#xff08;基础原则&#xff0c;单生产者或多生产者均不能在消费端关闭&#xff09;&#xff1b; 2、多个生产者时&#xff0c;不能对channel执行关闭&#xff1b; 3、只有在唯一或最后唯一剩下的生产者协程中关闭channel&…