[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第46讲。
数位递增数,本题是2020年11月21日举办的第12届蓝桥杯青少组Python编程选拔赛真题,题目要求编写程序统计10到n中数位递增数的个数。
先来看看题目的要求吧。
一.题目说明
提示信息:
一个正整数如果任何一个数位小于等于右边相邻的数位,则称为一个数位递增数。例如:
1135是一个数位递增数
1024不是一个数位递增数
编程实现:
输入一个正整数n(10 < n < 10001),输出10到n(包含10和n)中有多少个数位递增数。例如:输入15,10到15之间的数位递增数有:11、12、13、14、15。一共有5个。
输入描述:
输入一个正整数n(10 < n < 10001)
输出描述:
输出10到n中有多少个数位递增数
样例输入:
15
样例输出:
5
二.思路分析
这是一道简单的运算题,考查的知识点包括循环、数字和字符串的转换和字符的比较等。
首先要理解什么是递增数,就像生活中的排队现象,按照从小到大的顺序依次排列,如图:
将这里的小朋友换成数字就可以了,如图:
一旦理解了递增数,解决的思路也就有了,我们可以使用循环从数字的最高位开始,逐个和右边相邻的数位进行比较。
以数字1135为例,它的长度为4,最多需要进行3次比较,如下:
第1次:1 <= 1 成立
第2次:1 <= 3 成立
第3次:3 <= 5 成立
所以,1135是数位递增数。
再来看看1024,它的长度也是4,最多需要进行3次比较,如下:
第1次:1 <= 0 不成立
在比较第一次的时候,就不满足条件,后续就不需要比较了。
为了更好地组织代码,我们可以自定义一个函数,用于判断数字n是否为递增数。
不过,这里有一个关键问题,就是如何获取数字的每一位,通常有两种方式:
-
数学方法
-
字符串方法
数学方法是指将数字的每一位拆解出来,通常需要运用拆位算法。而字符串方法则比较简单,将数字转成字符串,然后通过下标(索引)获取每一位。
很显然,使用字符串更加简单,而且字符也是可以直接比较大小的,它们在比较大小的时候是按照ASCII码顺序来比较的,例如:
'0' 和 '1'
字符'0'~'9'的在ASCII码如下表所示:
在比较的时候,是将字符'0'的ASCII码48和字符'1'的ASCII码49进行比较,很显然,48 < 49,所以'0' < '1'。
所以,在对数字字符比较大小的时候,完全可以当作数字来比较。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们分两步来编写程序:
-
自定义函数
-
循环统计个数
1. 自定义函数
根据前面的思路分析,我们定义函数如下:
代码比较简单,说明三点:
1). 这里函数命名的时候,使用了下划线,就是使用下划线将多个单词隔开,这种命名方式称作下划线命名法;
2). 循环的次数是 len(s) - 1,一定要减去1;
3). 如果不知道字符直接比较,将s[i]和s[i + 1]转成数字进行比较也是可以的,使用int()函数即可。
2. 循环统计个数
有了自定义函数,接下来就只需要循环统计了,继续编写代码如下:
至此,整个程序就全部完成了,你也可以输入不同的数字来测试程序了。
四.总结与思考
本题代码在12行左右,涉及到的知识点包括:
-
输入输出;
-
循环编程;
-
数字和字符串的互转;
-
字符串的比较;
本题难度一般,关键是要理解数位递增数的概念,找到判断的思路和方法。
很多同学直接在循环中判断是否为数位递增数,认为这个函数是多余的。从结果来看,要不要函数都一样,但是从解决问题的角度来看,使用函数显然是更好的选择。
使用自定义函数的好处是能够简化代码结构,减少出错的概率。更重要的是它提供了一种分析问题、解决问题的思维方式,这就是分解思维。
将复杂的问题拆分成多个简单的问题,逐一解决这些简单问题,整个问题就迎刃而解了。不要小看这个思维,一旦掌控了这种思维,你就像开了一个外挂,不仅可以解决学习中的各种问题,还可以解决生活中和将来工作中遇到的各种问题。
超平老师给你留一个思考题,除了上面介绍的方法,你还有什么好方法来实现判断数位递增数呢?
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要源码的,可以移步至“超平的编程课”gzh。