当前位置:   article > 正文

pythonB组2023年真解析--A:2023_2023年蓝桥杯省赛pythonb组

2023年蓝桥杯省赛pythonb组

试题A:2023

【问题描述】

请求出在 12345678(含) 至 98765432(含) 中,有多少个数中完全不包含 2023 。

完全不包含 2023 是指无论将这个数的哪些数位移除都不能得到 2023 。

例如 20322175,33220022 都完全不包含 2023,而 20230415,20193213 则

含有 2023 (后者取第 1, 2, 6, 8 个数位) 。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一

个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

        拿到题目之后(摩拳擦掌),首先仔细分析(仔细审题):

1,数据范围:【12345678,98765432】是个闭区间,因此循环中必须包含到头尾(粗心的同学自己拿出小本本记好!!千万不要丢三落四),

2,完全不包含2023:

        1,“2023” 不在这个数字之中,也就是说:“2023” not in str(nums),这是最容易想到的一种情况(如果是大题的话可以骗分,毕竟肯定可以通过某些样例的,敲黑板+手动狗头)。

        2,“无论将这个数的哪些数位移除都不能得到 2023”:只是通过移除某些数字,因此,不存在将数字位进行调换的情况

        3,通过移除某些数字位无法得到“2 0 2 3”:也就是说,在移除某些数字位之后,2,0,2,3必须按照顺序出现,类似于2032这种将不符合题目要求,这是比较关键的一点(敲黑板)

        题目分析完之后,拿出我们最擅长的工具(python!!!)进行解剖,按照题目意思,最先想到的肯定是最简单粗暴地字符串遍历方法,由于这只是一道填空题,暴力也不失为一种不错的方法,但是这里需要注意一个重要的点,这决定到你是否可以完整的给出答案!(敲黑板)

       当你掏出  str.find()  函数准备迎敌的时候,仅仅知道  str.find(target)  这是完完全全不够的,当你满怀信心的写完这部分代码并发现它是四个嵌套循环的时候,然后发现范围大的就算是跑一个小时也跑不完的时候(下一题!),这里重点就来了(敲黑板准备做笔记),那就是 str.find  函数完整的结构应该是:

        str.find(sub, [start, [end]])

是的没错!find函数还可以指定查找的范围!所以完整的思路就来了!

        我们只需要定义一个函数,作用就是将传进来的数字进行不断查找,并且每次查找的范围都在上一个已经找到的字符之后,比如:第一个  “2”  出现的位置下标识2.那么下一个  “0”  就可以从2+1=3的下标位置开始查找,其余元素同理;再根据find函数的特性,如果没有查找到该元素,返回的将是  -1  ,再次敲黑板(逻辑思维要跟上),根据题目意思,只要“2 0 2 3”这几个数字一个都没有出现或者没有按照顺序出现,则这个数就是我们的目标!!!(注意要求,是完全不包含2023的数,思维跟上!)因此,我们只需要设置四个if判断,只要上一个find函数返回值为  -1  直接得到目标数字!!!

        综合整理以上思路,定义的函数如下:

  1. def find2023(nums):
  2. s = str(nums) # 将传入的数字转换成字符串
  3. first = s.find("2") # 查找第一个 “2” 出现的位置
  4. if first == -1: # 不在nums中
  5. return False
  6. sec = s.find("0",first+1) # 在nums中,从后一个继续查找下一个元素 “0” ,之后的思路以此类推
  7. if sec == -1:
  8. return False
  9. thi = s.find("2",sec+1)
  10. if thi == -1:
  11. return False
  12. four = s.find("3",thi+1)
  13. if four == -1:
  14. return False
  15. return True # 通过所有的if,那么这个数包含2023

完整的代码如下:

  1. import os
  2. import sys
  3. # 请在此输入您的代码
  4. def find2023(nums):
  5. s = str(nums) # 将传入的数字转换成字符串
  6. first = s.find("2") # 查找第一个 “2” 出现的位置
  7. if first == -1: # 不在nums中
  8. return False
  9. sec = s.find("0",first+1) # 在nums中,从后一个继续查找下一个元素 “0” ,之后的思路以此类推
  10. if sec == -1:
  11. return False
  12. thi = s.find("2",sec+1)
  13. if thi == -1:
  14. return False
  15. four = s.find("3",thi+1)
  16. if four == -1:
  17. return False
  18. return True # 通过所有的if,那么这个数包含2023
  19. if __name__=="__main__":
  20. count = 0 # 设置计数器
  21. for i in range(12345678,98765433):
  22. res = find2023(i) # 将数字传入函数进行判断
  23. if not res: # 不包含2023,目标数字!!!
  24. count += 1
  25. print(count)

        最后的结果:(这里是直接print上面代码运行的结果,直接运行时间真的不够用!!!)

以上就是本文的全部内容啦,如果你有更好更妙的解法和看法,欢迎评论区留言!最后祝各位15届蓝桥杯取得好成绩!!!(撒花撒花撒花)

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/64244
推荐阅读
相关标签
  

闽ICP备14008679号