[导读]:超平老师的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分:能正确输出四组数据。
二.思路分析
这是一道简单的排列组合题目,考查的知识点包括循环语句、条件语句、列表和取模运算等。
关于排列组合,在之前的选拔赛和省赛中都出现过,具体的分析可以参考如下两篇教程:
-
《数字组合-第10届蓝桥杯省赛Python真题精选》
-
《排列组合-第11届蓝桥杯选拔赛Python真题精选》
都是排列组合,因此我们可以使用枚举算法和组合函数两种方法来解决,对于这类问题,超平老师强烈建议使用组合函数。
当然,本题的情况要更复杂一点,主要有如下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。