zl程序教程

您现在的位置是:首页 >  其他

当前栏目

蓝桥杯寒假集训第九天(回文日期)

2023-02-19 12:29:32 时间

没有白走的路,每一步都算数???

题目描述:

输入一行数据,这个数据是从10000101到89991231,输出这个数据后面的第一个回文数,以及输出第一个ABABBABA型的回文数。

注意:这两个回文数可以相同。这个题目的题意应该说明一下。

输入描述:

第一行:

第一行输入一个八位数

输出描述:

输出两个数据,一个是这个数字后面的回文数,样式没有要求。

另外一个是这个数字后面的回文数,但是样式有要求。要求格式位ABABBABA型的数字。

样例输入输出:

样例输入:

20200202 样例输出:

20211202

21211212

算法思路:

由于年份很少,题目只给出8位的数字,我们构建出所有的回文年份的前面四位数字。反正用的是模拟,接着用for循环遍历所有的前面的四位数字,判断这个前面四个数字所衍生出来的回文数,是不是大于这个输入的数据,如果是,就输出。第二个数,就是直接在if条件加一个限制。

 找到第一个回文数

思路:先把前面的四位数提取出来,之后用暴力法,找到我们的数组中第一个大于等于这个四位数的数组的下标,之后输出这个数据。

 题目仍然提示有部分代码没有通过,看到这里出现了重复的情况

不断测试,找到bug

 这里要求的是ABABBABA,那么11111111不应该存在,if条件出错。改完之后,仍旧是90%的通过率,所以只能采取对拍操作,把AC的代码和自己的代码的每个结果输出,做个对比。

import os
import sys
##while 1:
n = int(input())
Y = [10,11,12,13,20,21,22,30,31,32,40,41,42,50,51,52,60,61,62,70,71,72,80,81,82,90,91,92]
M = [1,10,11,20,21,30,40,50,60,70,80,90]
    ##x = len(Y)*len(M)*[0]
    ##print(len(Y))
    ##print(x)
x = []
y = [0,0,0,0]
ans = ''
for i in range(len(Y)):
    if Y[i]==13:
        for j in range(len(M)):
            if M[j] == 11 or M[j] == 20 or M[j]==40 \
               or M[j]==60 or M[j]== 90:
                x.append(0)
            else:
                x.append(Y[i]*100+M[j])
    elif Y[i]==82:
        for j in range(len(M)):
            if M[j]==20:
                x.append(0)
            else:
                x.append(Y[i]*100+M[j])
    else:
        for j in range(len(M)):
            x.append(Y[i]*100+M[j])
##print(x)
##print(len(x))
##for i in range(len(x)):
##    print(x[i],end = ' ')
##    if (i+1)%10==0:
##        print()

        
for i in range(len(x)):
##    print(n//10000)
    if x[i]>(n//10000):
##        print(n//1000)
        tmp = x[i]
        ans+=(str(x[i]))
##        x[i] = 0
        for j in range(4):
            y[j] = tmp%10
            tmp = tmp//10
            ans+=str(y[j])
        print(ans)
        break
ans1 = ''
for i in range(len(x)):
    a = x[i]%10
    b = x[i]//10%10
    c = x[i]//100%10
    d = x[i]//1000
    if x[i]>(n//10000) and a==c and b == d and b!=c:
        tmp = x[i]
        ans1+=(str(x[i]))
        for j in range(4):
            y[j] = tmp%10
            tmp = tmp//10
            ans1+=str(y[j])
        if ans1!=ans:
            print(ans1)
            break

 对拍

正确的AC代码

错误的代码

 修改之后仍旧出先新错误

 再次修改

这里不应改会出现0的,因为存在82200228,最开始想到是8220的2月份有29天,所以就把这里设为0,结果翻车.

正确的代码                                                     错误的代码

 仍然出错,这里我想到之前的错误可能会又犯,一查,还真是,变量一多,if,else就特别容易写错。

正确的代码                                                         错误的代码

 原因:

 AC代码

 原始版

import os
import sys
##while 1:
n = int(input())
Y = [10,11,12,13,20,21,22,30,31,32,40,41,42,50,51,52,60,61,62,70,71,72,80,81,82,90,91,92]
M = [1,10,11,20,21,30,40,50,60,70,80,90]
    ##x = len(Y)*len(M)*[0]
    ##print(len(Y))
    ##print(x)
x = []
y = [0,0,0,0]
ans = ''
for i in range(len(Y)):
    if Y[i]==13:
        for j in range(len(M)):
            if M[j] == 11 or M[j] == 20 or M[j]==40 \
               or M[j]==60 or M[j]== 90:
                x.append(0)
            else:
                x.append(Y[i]*100+M[j])
##    elif Y[i]==82:
##        for j in range(len(M)):
##            if M[j]==20:
##                x.append(0)
##            else:
##                x.append(Y[i]*100+M[j])
    else:
        for j in range(len(M)):
            x.append(Y[i]*100+M[j])
##print(x)
##print(len(x))
##for i in range(len(x)):
##    print(x[i],end = ' ')
##    if (i+1)%10==0:
##        print()

        
for i in range(len(x)):
##    print(n//10000)
    if x[i]>=(n//10000):
##        print(n//1000)
        tmp = x[i]
        ans+=(str(x[i]))
##        x[i] = 0
        for j in range(4):
            y[j] = tmp%10
            tmp = tmp//10
            ans+=str(y[j])
        if int(ans)>n:
            print(ans)
            break
        else:
            ans = ''
##print(x)
ans1 = ''
for i in range(len(x)):
    a = x[i]%10
    b = x[i]//10%10
    c = x[i]//100%10
    d = x[i]//1000
    if x[i]>=(n//10000) and a!=b and b == d and a==c:
        tmp = x[i]
        ans1+=(str(x[i]))
        for j in range(4):
            y[j] = tmp%10
            tmp = tmp//10
            ans1+=str(y[j])
        if int(ans1)>n:
            print(ans1)
            break
        else:
            ans1 = ''

修正的代码

import os
import sys
n = int(input())
Y = [10,11,12,13,20,21,22,30,31,32,40,41,42,50,51,52,60,61,62,70,71,72,80,81,82,90,91,92]
M = [1,10,11,20,21,30,40,50,60,70,80,90]
x = []
y = [0,0,0,0]
ans = ''
for i in range(len(Y)):
    if Y[i]==13:
        for j in range(len(M)):
            if M[j] == 11 or M[j] == 20 or M[j]==40 \
               or M[j]==60 or M[j]== 90:
                x.append(0)
            else:
                x.append(Y[i]*100+M[j])
    else:
        for j in range(len(M)):
            x.append(Y[i]*100+M[j])
        
for i in range(len(x)):
    if x[i]>=(n//10000):
        tmp = x[i]
        ans+=(str(x[i]))
        for j in range(4):
            y[j] = tmp%10
            tmp = tmp//10
            ans+=str(y[j])
        if int(ans)>n:
            print(ans)
            break
        else:
            ans = ''
ans1 = ''
for i in range(len(x)):
    a = x[i]%10
    b = x[i]//10%10
    c = x[i]//100%10
    d = x[i]//1000
    if x[i]>=(n//10000) and a!=b and b == d and a==c:
        tmp = x[i]
        ans1+=(str(x[i]))
        for j in range(4):
            y[j] = tmp%10
            tmp = tmp//10
            ans1+=str(y[j])
        if int(ans1)>n:
            print(ans1)
            break
        else:
            ans1 = ''

彩蛋

发现蓝桥杯这道题目的测试数据还是有一点少的。举一个小案例说明:

每日一句

摘自《《晚熟的人》》:

晚熟的人,一般简单又纯真,看起来傻乎乎,却傻人有傻福,有着谁也抢不走的人间幸福。