小言_互联网的博客

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

293人阅读  评论(0)

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

题目描述:

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

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

输入描述:

第一行:

第一行输入一个八位数

输出描述:

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

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

样例输入输出:

样例输入:

20200202
样例输出:

20211202

21211212

算法思路:

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

 找到第一个回文数

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

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

不断测试,找到bug

 

 

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


  
  1. import os
  2. import sys
  3. ##while 1:
  4. n = int( input())
  5. 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]
  6. M = [ 1, 10, 11, 20, 21, 30, 40, 50, 60, 70, 80, 90]
  7. ##x = len(Y)*len(M)*[0]
  8. ##print(len(Y))
  9. ##print(x)
  10. x = []
  11. y = [ 0, 0, 0, 0]
  12. ans = ''
  13. for i in range( len(Y)):
  14. if Y[i]== 13:
  15. for j in range( len(M)):
  16. if M[j] == 11 or M[j] == 20 or M[j]== 40 \
  17. or M[j]== 60 or M[j]== 90:
  18. x.append( 0)
  19. else:
  20. x.append(Y[i]* 100+M[j])
  21. elif Y[i]== 82:
  22. for j in range( len(M)):
  23. if M[j]== 20:
  24. x.append( 0)
  25. else:
  26. x.append(Y[i]* 100+M[j])
  27. else:
  28. for j in range( len(M)):
  29. x.append(Y[i]* 100+M[j])
  30. ##print(x)
  31. ##print(len(x))
  32. ##for i in range(len(x)):
  33. ## print(x[i],end = ' ')
  34. ## if (i+1)%10==0:
  35. ## print()
  36. for i in range( len(x)):
  37. ## print(n//10000)
  38. if x[i]>(n// 10000):
  39. ## print(n//1000)
  40. tmp = x[i]
  41. ans+=( str(x[i]))
  42. ## x[i] = 0
  43. for j in range( 4):
  44. y[j] = tmp% 10
  45. tmp = tmp// 10
  46. ans+= str(y[j])
  47. print(ans)
  48. break
  49. ans1 = ''
  50. for i in range( len(x)):
  51. a = x[i]% 10
  52. b = x[i]// 10% 10
  53. c = x[i]// 100% 10
  54. d = x[i]// 1000
  55. if x[i]>(n// 10000) and a==c and b == d and b!=c:
  56. tmp = x[i]
  57. ans1+=( str(x[i]))
  58. for j in range( 4):
  59. y[j] = tmp% 10
  60. tmp = tmp// 10
  61. ans1+= str(y[j])
  62. if ans1!=ans:
  63. print(ans1)
  64. break

 对拍

正确的AC代码

错误的代码

 

 修改之后仍旧出先新错误

 再次修改

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

正确的代码                                                     错误的代码

 

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

正确的代码                                                         错误的代码

 原因:

 AC代码

 原始版


  
  1. import os
  2. import sys
  3. ##while 1:
  4. n = int( input())
  5. 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]
  6. M = [ 1, 10, 11, 20, 21, 30, 40, 50, 60, 70, 80, 90]
  7. ##x = len(Y)*len(M)*[0]
  8. ##print(len(Y))
  9. ##print(x)
  10. x = []
  11. y = [ 0, 0, 0, 0]
  12. ans = ''
  13. for i in range( len(Y)):
  14. if Y[i]== 13:
  15. for j in range( len(M)):
  16. if M[j] == 11 or M[j] == 20 or M[j]== 40 \
  17. or M[j]== 60 or M[j]== 90:
  18. x.append( 0)
  19. else:
  20. x.append(Y[i]* 100+M[j])
  21. ## elif Y[i]==82:
  22. ## for j in range(len(M)):
  23. ## if M[j]==20:
  24. ## x.append(0)
  25. ## else:
  26. ## x.append(Y[i]*100+M[j])
  27. else:
  28. for j in range( len(M)):
  29. x.append(Y[i]* 100+M[j])
  30. ##print(x)
  31. ##print(len(x))
  32. ##for i in range(len(x)):
  33. ## print(x[i],end = ' ')
  34. ## if (i+1)%10==0:
  35. ## print()
  36. for i in range( len(x)):
  37. ## print(n//10000)
  38. if x[i]>=(n// 10000):
  39. ## print(n//1000)
  40. tmp = x[i]
  41. ans+=( str(x[i]))
  42. ## x[i] = 0
  43. for j in range( 4):
  44. y[j] = tmp% 10
  45. tmp = tmp// 10
  46. ans+= str(y[j])
  47. if int(ans)>n:
  48. print(ans)
  49. break
  50. else:
  51. ans = ''
  52. ##print(x)
  53. ans1 = ''
  54. for i in range( len(x)):
  55. a = x[i]% 10
  56. b = x[i]// 10% 10
  57. c = x[i]// 100% 10
  58. d = x[i]// 1000
  59. if x[i]>=(n// 10000) and a!=b and b == d and a==c:
  60. tmp = x[i]
  61. ans1+=( str(x[i]))
  62. for j in range( 4):
  63. y[j] = tmp% 10
  64. tmp = tmp// 10
  65. ans1+= str(y[j])
  66. if int(ans1)>n:
  67. print(ans1)
  68. break
  69. else:
  70. ans1 = ''

修正的代码


  
  1. import os
  2. import sys
  3. n = int( input())
  4. 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]
  5. M = [ 1, 10, 11, 20, 21, 30, 40, 50, 60, 70, 80, 90]
  6. x = []
  7. y = [ 0, 0, 0, 0]
  8. ans = ''
  9. for i in range( len(Y)):
  10. if Y[i]== 13:
  11. for j in range( len(M)):
  12. if M[j] == 11 or M[j] == 20 or M[j]== 40 \
  13. or M[j]== 60 or M[j]== 90:
  14. x.append( 0)
  15. else:
  16. x.append(Y[i]* 100+M[j])
  17. else:
  18. for j in range( len(M)):
  19. x.append(Y[i]* 100+M[j])
  20. for i in range( len(x)):
  21. if x[i]>=(n// 10000):
  22. tmp = x[i]
  23. ans+=( str(x[i]))
  24. for j in range( 4):
  25. y[j] = tmp% 10
  26. tmp = tmp// 10
  27. ans+= str(y[j])
  28. if int(ans)>n:
  29. print(ans)
  30. break
  31. else:
  32. ans = ''
  33. ans1 = ''
  34. for i in range( len(x)):
  35. a = x[i]% 10
  36. b = x[i]// 10% 10
  37. c = x[i]// 100% 10
  38. d = x[i]// 1000
  39. if x[i]>=(n// 10000) and a!=b and b == d and a==c:
  40. tmp = x[i]
  41. ans1+=( str(x[i]))
  42. for j in range( 4):
  43. y[j] = tmp% 10
  44. tmp = tmp// 10
  45. ans1+= str(y[j])
  46. if int(ans1)>n:
  47. print(ans1)
  48. break
  49. else:
  50. ans1 = ''

彩蛋

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

 

每日一句

摘自《《晚熟的人》》:

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


转载:https://blog.csdn.net/weixin_54201782/article/details/128596161
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场