题目:2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个 R 期按“ ymmdd ”沿格式写成一一个8位数是20200202恰好是一个回文数。我们称这样沿旧期是回文日期。
有人表示20200202是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:202112D2即2021年12月2日。也有人表示20200202并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100年后就能遇到下一个ABABBABA型的回文日期:21211212即2121年12月12日。算不上“千年一遇”,项多算“千年两遇”。
给定一个8位数的日,请你计算该日期之后下一一个回文日期和下一个ABABBABA型沿回文日期各是哪一天。
分析:需要考虑的问题:
1.数值要比输入的大,
解决:创建符合条件的list
2.将回文日期分为年份和年份倒序,对正序切片分为月,号,
解决:整数切片处理,但我一直思考一个问题,例如20200202,月号拆分就是02,02,如果直 接02 == 2,02是错误格式,所以切片的时候计算机自动忽略了02前面的0,将其转化为正 确格式......
3.月份对应天数的判断
解决:if,else解决问题
定义函数是较优选择!
huiwen = int(input("输入回文日期:")) #输入回文日期
def TF(x): #定义一个函数
month = int(x[:2]) #输入回文日期的前两位,整数
day = int(x[2:4]) #输入回文日期的后两位,整数
x = int(x) #将其整数化
if 1 <= month <= 12: #判断月份,排除2000这种,00为末尾的年份
if month == 2: #判断2月份
if x % 4 == 0:
if day <= 29: #判断日期能不能对的上月份的天数,开始逐渐缩小范围
return True
else:
return False
else:
if day <= 28:
return True
else:
return False #使2月份能对的上天数
if month in [1, 3, 5, 7, 8, 10, 12]: #判断31天的月份
if day <= 31:
return True
else:
return False
else: #判断剩下的30天的月份
if day <= 30:
return True
return False #省略else
lt1 = [] #创建空列表容纳满足条件的回文日期,从中选择大于huiwen且最接近的回文日期
lt2 = []
for i in range(1000, 9999): #个人感觉可以排除很多年份,但是大范围保险一点
x1 = str(i)[::-1] #正常回文,字符串
x2 = (str(i)[:2]+str(i)[:2])[::-1] #ABAB回文:BABA,字符串
if TF(x1) and int(x1[::-1] + x1) > huiwen: #月份和日期符合定义函数要求,
lt1.append(int(x1[::-1] + x1)) #注意:x1是倒序,x1[::-1]是正序,如果将其写反,会无范围
if TF(x2) and int(x2[::-1] + x1) > huiwen:
lt2.append(int(x2[::-1] + x1))
print(min(lt1))
print(min(lt2))