python,回文日期【第十一届】【省赛】【研究生组】

代码和详细思路在结尾,核心思路如下:

1.将列表日期,转为为数值型数据,如x = [2,0,2,0,0,2,0,2] 转化为一个值为20200202的整数

2.再进行数值大小的比较,确保选择的日期大于初始输入的日期(这里不能等于,因为要保证的是下一个回文日期),例如20211212 大于 20200202 显然成立,而20200201和20200202一个小于20200202一个又相等了,都不行

3.在满足日期往后选择的基础上,筛选出回文日期。

4.在筛选回文日期的途中,让上一个最小回文日期的值和当前比较,如果这个回文日期小于上一个,就更新选择最小的。(因为回文日期的值越小,说明此日期越靠前,即越接近我们的开始的日期)

5.同理ABABBABA样式的类似回文日期一样筛选,两者是独立的。但感觉可以简化有兴趣的笔友可以一试,因为ABABBABA是可以在回文日期的基础上进行的,可以不用独立联系起来。

思路更多详情在后面

 

以下是代码里面的注释(详细思路),也包含在了代码里:

#将输入的字符串转为为整型列表。且切片提取出年、月、日

#先判断以下是否为闰年,因为闰年二月有29天,平年有28天

#将列表日期,转为为数值型数据,如x = [2,0,2,0,0,2,0,2] 转化为一个值为20200202的整数,int(1e7)等价于1后7个零即:10000000,后面同理转为一个整数。
#先把初始输入的日期转为一个整数

#循环总目的是,模拟月份和号,思路是在符合回文要求的数中选择最小的,只关心满足回文条件的数

两个循环:

#1.月份i取值[1,2...,12]

#2.#天数j取值[1,2...,monthh[i]],这里的monthh[i]是上文经过闰年判断后的数组

#先将月份、号数这两个整数转化为列表,因为方便推出年数(因为思路是在符合回文要求的数中选择最小的,故我们只关心满足回文条件的数)
#例如12,31则有idex= [2,1],jdex = [1,3]

#因为只关心满足回文的数,故此时可以推出年份为1321,总为13211231
#得到idex、jdex后,为了与初始日期比较,将其和月份、天数转为一个整数,将两个整数的比较作为日期靠前靠后的凭证,
#避免了用两个列表比较的复杂

#将输入的字符串转为为整型列表。且切片提取出年、月、日
x = list(input())
timee = [int(_) for _ in x]#这里‘_’等价于'x',是一个常规变量符号
y = timee[0:4]#年
m = timee[4:6]#月
d = timee[6:8]#日

#先判断以下是否为闰年,因为闰年二月有29天,平年有28天
monthh = [0,31,28,31,30,31,30,31,31,30,31,30,31]#初始每一个月的天数
year = (y[0]*1000+y[1]*100+y[0]*10+y[1])
if year % 4==0 and year % 100 or year % 400 == 0:#闰年
    monthh[2] = 29#闰年二月29天
else:#平年
    monthh[2] = 28#平年二月28天

#处理开始
minn1 = 1e10#初始找出最小的回文日期,跟新后作为最后的结果1
minn2 = 1e10#初始找出最小的ABABBABA样式的,更新后作为最后的结果2

#将列表日期,转为为数值型数据,如x = [2,0,2,0,0,2,0,2] 转化为一个值为20200202的整数,int(1e7)等价于1后7个零即:10000000,后面同理转为一个整数。
#先把初始输入的日期转为一个整数
yymmdd = y[0] * int(1e7) + y[1] * int(1e6) + y[2] * int(1e5) + y[3]*int(1e4) + m[0]*int(1e3)+m[1]*int(1e2)+d[0]*int(1e1)+d[1]
#循环总目的是,模拟月份和号,思路是在符合回文要求的数中选择最小的,只关心满足回文条件的数
for i in range(1,12+1):#月份i取值[1,2...,12]
    for j in range(1,monthh[i]+1):#天数j取值[1,2...,monthh[i]],这里的monthh[i]是上文经过闰年判断后的数组
        #先将月份、号数这两个整数转化为列表,因为方便推出年数(因为思路是在符合回文要求的数中选择最小的,故我们只关心满足回文条件的数)
        #例如12,31则有idex= [2,1],jdex = [1,3]
        idex=[i%10,int(i/10)];#[2,1]
        jdex=[j%10,int(j/10)];#[1,3]
        #因为只关心满足回文的数,故此时可以推出年份为1321,总为13211231
        #得到idex、jdex后,为了与初始日期比较,将其和月份、天数转为一个整数,将两个整数的比较作为日期靠前靠后的凭证,
        #避免了用两个列表比较的复杂
        size = jdex[0] * int(1e7) + jdex[1] * int(1e6)+ idex[0] * int(1e5)+idex[1] * int(1e4)+ i * 100 + j
        
        #只关注大于初始日期的,
        if size > yymmdd:
            #判断,找出最小的回文日期
            if size <= minn1:
                minn1 = size
            #判断,找出最小的ABABBABA样式的
            if idex[1] == jdex[1] and idex[0] == jdex[0] and size <= minn2:
                minn2 = size
        else:#若在初始日期之前的日期,则不管
            pass
#print result        
print(minn1,minn2,sep='\n')
#test 样例
#20200202

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值