三位数组合-第12届蓝桥杯选拔赛Python真题精选

发布于:2024-03-28 ⋅ 阅读:(24) ⋅ 点赞:(0)

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第42讲。

三位数组合,本题是2020年9月20日举办的第12届蓝桥杯青少组Python编程选拔赛真题。题目要求编程统计所有三位数组合的个数,要求三位数是奇数,并且不能以0开头。

先来看看题目的要求吧。

一.题目说明

编程实现:

用户输入一个正整数N(3 <= N <= 9),从0到N之间的所有正整数(包含0和N)中选择三个,组成一个三位数(0不能作为百位数),且这个三位数为奇数,请计算出共有多少种满足条件的三位数组合。(注意:组成的每个三位数各个位上的数字不能重复)

输入描述:

输入一个正整数N(3 <= N <= 9)

输出描述:

输出满足条件的三位数组合的个数

样例描述:

用户输入的正整数为3,也就是将0,1,2,3四个数字进行组合,符合要求的三位数为:103, 123, 203, 213, 201, 231, 301, 321共8个,所以输出8。

样例输入:

3

样例输出:

8

评分标准:

  • 5分:能正确输出一组数据;

  • 5分:能正确输出两组数据;

  • 7分:能正确输出三组数据;

  • 8分:能正确输出四组数据。

二.思路分析

这是一道简单的排列组合题目,考查的知识点包括循环语句、条件语句、列表和取模运算等。

关于排列组合,在之前的选拔赛和省赛中都出现过,具体的分析可以参考如下两篇教程:

都是排列组合,因此我们可以使用枚举算法和组合函数两种方法来解决,对于这类问题,超平老师强烈建议使用组合函数。

当然,本题的情况要更复杂一点,主要有如下3点:

  • 待组合的数字和输入的N有关;

  • 0不能作为百位数;

  • 三位数必须为奇数;

因此,首先我们需要根据输入的整数N来构造列表,然后使用permutations()函数生成三位数组合,在生成组合的同时,将百位数为0和奇数的三位数过滤掉。

思路有了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们编写程序如下:

图片

代码不多,强调三点:

1). 题目要求待排列数字包含0和N,所以在使用range()函数的时候,需要使用n+1,因为range()函数虎头蛇尾(包含头不包含尾);

2). 使用permutations()函数,返回的是一个可迭代对象,通常使用for..in进行遍历,遍历时得到的t是元组;

3). 元组t有3个元素,直接使用下标访问,t[0]表示百位,t[1]是十位,t[2]是个位,当t[0] > 0,就构造三位数x,如果x为奇数,就加入到res列表中。

至此,整个程序就全部完成了,你也可以输入不同的数字来测试效果。

四.总结与思考

本题代码在10行左右,涉及到的知识点包括:

  • 循环语句,主要for...in循环;

  • 条件语句,尤其是条件嵌套;

  • 列表和元组;

  • 组合函数;

本题难度一般,关键在于把问题分析清楚,然后使用permutations()函数简化组合的过程,同时将不符合要求的组合过滤掉。

如果不借助permutations()函数,我们需要使用枚举算法,通过嵌套循环来组合数字,代码会麻烦一些。

两相对比,你会发现使用permutations()函数代码要简洁不少,这不正是Python的优点嘛,它提供了大量好用的模块和库函数,我们在学习Python的时候要多掌握这些函数的使用,从而提高编程效率。

超平老师给你留一道思考题,对于本题的测试数据,有没有好的办法,做到快速测试呢?

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以移步至“超平的编程课”gzh。

本文含有隐藏内容,请 开通VIP 后查看