题目:
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入:
20200202
输出:
20211202
21211212
代码:
def judge(year, month, day):
# 判断日期的合理性
# 是否是闰年,闰年的二月比较特殊
if (year % 4 == 0 and year % 400 != 0) or year % 400 == 0:
if month == 2 and day > 29:
return False
else:
if month == 2 and day > 28:
return False
#月份是否合理
if month > 12 or month <= 0:
return False
# 日期是否合理
if day > 31 and month in [1, 3, 5, 7, 8, 10, 12]:
return False
if day > 30 and month not in [1, 3, 5, 7, 8, 10, 12]:
return False
# 年月日都没问题返回True
return True
n = input()
year = n[:4] #取出输入日期的年份
md = n[4:] #取出输入日期的月份和日期
flag1 = True #回文但不是ABAB型的控制变量
flag2 = True #回文并且是ABAB型的控制变量
if int(year) > int(md[::-1]):
year1 = int(year) # 防止将本年内还有可能回文的年份跳过去 如20200101,30300101
else:
year1 = int(year) + 1 # 今年已经不可能再回文了,故跳过
for i in range(year1, 10000):
#这里采用改变年份,而不是改用月份或者日期,前者一次循环增加一年,后者增加的很不固定了
year2 = str(i)
md1 = str(i)[::-1]
if judge(int(year2), int(md1[:2]), int(md1[2:])):
if flag1 == True:
print(year2, md1, sep='')
flag1 = False #找到第一个输出后就将flag1设为False,以后不在输出这种回文日期
if year2[:2] == year2[2:] and flag2 == True:
print(year2, md1, sep='')
flag2 = False #找到第一个输出后就将flag2设为False,以后不在输出这种回文日期
if flag1 == False and flag2 == False:
# 两种回文日期个输出一次,结束循环
break