试题 历届真题 回文日期【第十一届】【省赛】【B组】python

该博客讨论了一个用于寻找给定日期之后的下一个回文日期和ABABBABA型回文日期的算法。通过输入一个8位数的日期,程序会检查并输出下一个满足条件的日期。20200202被提到作为回文日期的例子,而20211202和21211212分别是下一个回文日期和ABABBABA型回文日期的例子。文章重点在于提供的Python代码实现,该代码逐日遍历,直到找到符合条件的日期为止。
摘要由CSDN通过智能技术生成
资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

问题描述

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd”的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是“千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上“千年一遇”,顶多算“千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

输入格式

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

输出格式

第一行表示下一个回文日期,
第二行表示下一个 ABABBABA 型的回文日期。

输入样例

20200202

输出样例

20211202
21211212

数据范围

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

def check1(date):# 判断是否为回文日期
    if date == date[::-1]:
        return True
    return False
def check2(date):# 判断是否为ABABBABA型
    if check1(date):
        if date[:4] == date[4:][::-1]:
            if date[:2] == date[2:4]:
                return True
    return False
if __name__ == "__main__":  
    date = int(input())
    year = int(date / 10000) # 年份
    month = int(date % 10000 / 100) # 月份
    day = date % 100 + 1 # 天数
    # 闰年2月有29天--year % 400 == 0 || (year % 4 == 0 && year % 100 != 0
    flag = True # 标记查找回文日期是否停止
    flag2 = True # 标记查找ABABBABA型是否停止
    date1 = "" # 回文日期
    date2 = "" # ABABBABA型日期
    while(flag or flag2): # 一次while循环就循环一年的每一天
        # 循环月份
        for m in range(month,13):
            days = 0
            # 判断二月的天数
            if m == 2:
                if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
                    days = 29 # 闰年2月份29天
                else:
                    days = 28
            elif m in [4,6,9,11]:
                days = 30 # 小月
            else:
                days = 31   # 大月   
            for d in range(day, days):
                tmp = str(year) + str('%02d'%m) + str('%02d'%d)
                if flag and check1(tmp):
                    date1 = tmp
                    flag = False
                if check2(tmp):
                    date2 = tmp
                    flag2 = False           
        year += 1 # 如果没有找到往下一年继续找,年份加1
        month = 1 # 新的年份从1月开始
        day = 1 # 从1号开始
    print(date1)
    print(date2)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值