4.3.4 循环与else
1.for-else
for循环还能与保留字else搭配使用,for-else的语法结构如下:
else后的<语句块2>只在循环正常执行完成之后才执行,因此可以在<语句块2>中放置判断循环执行情况的语句。如下列代码:
运行结果:
【案例4-12】 质数的判断。
输入一个正整数,检查该数是否为质数。如输入34,输出结果为“34不是质数”;输入53,输出结果为“53是质数”。
案例分析:
质数是指某个数除了1和自身外,没有其他的因子。1不是质数,最小的质数是2。要判断一个数n是否有因子,则可以在2~n-1的范围内逐个检验是否存在n的因子,但是如果n是个非常大的值,则循环次数太多,时间复杂度过大,因而需要减小遍历的范围,如从2到n/2,则可以减少一半的次数。如果数字是16,则遍历范围可变成2~8。但是我们发现可以继续优化,16的因子有2、4、8。2是16的因子,同时16/2=8,找到2、8就不用再检验了,再找下一个因子4,16/4=4,因而我们遍历的范围可以变成2到16的平方根,即可找到这个数的因子。同样是数字n,对数字n开平方,如果得到小数,对它取整即可。
如果一个数能找到它的因子,那么它不是质数,如果循环结束了还没有找到因子,那么这个数就是质数。代码如下:
2.while-else
while循环也一样可以与保留字else搭配使用,语法如下:
在这种模式中,当while循环正常执行后,程序会继续执行else语句中的内容。else语句只在循环正常执行后才执行。因此,在<语句块2>中可以放置判断循环情况的语句。例如:
运行结果:
【案例4-13】 数字黑洞。
任意一个4位数,只要它各个位上的数字不是完全相同的,就有这样的规律:
①将组成该4位数的4个数字由大到小进行排列,形成由这4个数字构成的最大4位数;
②将组成该4位数的4个数字由小到大进行排列,形成由这4个数字构成的最小4位数(如果4个数中含有0,则得到的数不足4位);
③求两个数的差,得到一个新的4位数(高位零保留)。
重复以上过程,最后一定会得到的结果是6174。
比如:9998→0999→8991→8082→8532→6174,经过5次变换,得到6174。
编写程序,判断输入的4位数需要经过几次变换才能得到6174。
案例分析:
对输入的数字进行分离,再按大小排序。由于输入函数input()的返回值是字符串类型,所以可以用sorted()方法对字符串的字符进行分离并排序,得到一个列表。将列表的元素用join()方法拼接起来,得到一个排序后的字符串,再对两个字符串进行数据类型转换,用int()函数将它们变成整型,对转换类型后的两个数字进行减法运算,将运算结果用str()方法转换为字符串,以方便下一轮的分离、排序。如果减法运算得到的结果低于4位数,则添加0补齐4位。
实现代码如下:
运行结果如下: