自幂数是指一个 n 位数,它的每个位上的数字的n 次幂之和等于它本身。比如 153 = 1**3 + 5**3 + 3**3,是一个3位数的自幂数,也称水仙花数。

求所有的水仙花数。

求水仙花的循环逻辑很简单,range(100,1000),即从100到999。

但如何获取个位,十位,百位上的数字则需要灵活应用之前的知识。

个位:n%10,即数字除以10的余数。

十位:int(n/10)%10,即数字除以10的整数部分,再除以10的余数。

百位:int(n/100),即数字除以100的整数部分。


for n in range(100,1000):
    i = int(n/100)
    j = int(n/10)%10
    k = n % 10
    if n == i ** 3 + j ** 3 + k ** 3:
        print(n)


在这道题中,确定了循环范围[100,1000)后,对范围内的每个数字都进行了判断。但现实中,往往还有2种不一样的情形

1 碰到某个数字,循环直接结束。

2 碰到某个或某些数字,跳过它(或它们)。


报数表演节目游戏

报数游戏是集体活动时经常会玩的一个游戏。

假设有100个人,从1开始报数,碰到7的倍数跳过,如果没有跳过就惩罚他表演一个节目。


用python跳过第一行标题期初科目余额 python跳过本次循环_python



如果大家都是傻瓜

首先,如果只是100个人报数,我们用 print(i) 表示把数字 i 报数出来。

那么程序如下


for i in range(1,101):
   print(i)


程序执行,会在电脑屏幕上依次打印1,2,3,4,5,6,7,8……100。

当我们制定游戏规则是逢7的倍数跳过后,如果某个人不小心报出了7的倍数,循环就应该提前结束。

假设这100个人都是傻瓜,只会从1开始往后报数,那么当报到7的时候,游戏就结束了,就如下面的程序。


for i in range(1,101):
    print(i)
    if i % 7 == 0 :
        break


在python里,我们使用 break 来提前结束整个循环。

注意并体会break的缩进位置。

类似的例子还有判断一个数是不是素数(质数)。

比如,判断 n = 61199293 是不是素数。


n = 61199293
for i in range(2,n):
    if n % i == 0:
        print(i)
        print('n is not a prime number')
        break


循环的范围是[2,n),但如果我们在循环过程中找到一个数,可以整除n,那么n就已经不是素数了,后面的循环就没有必要继续下去了。所以,我们使用break提前结束了循环。

注意并体会break的缩进位置,可以把break换个位置,看看结果有什么不同。


如果大家都是聪明人

如果这100个人都是聪明人,都不会犯错。碰到7的倍数都会跳过。

程序就变成了下面这样


for i in range(1,101):
    if i % 7 == 0 :
        continue
    print(i)


程序执行,电脑屏幕上会打印1,2,3,4,5,6,8……100。

7的倍数都不会被打印。

原因在于,变量i从1开始循环, 每次都会先判断 i % 7 是否等于0。

如果 i % 7 不等于0,才会执行 print(i),把 i 打印出来。

如果 i % 7 等于0, 执行 continue,就提前跳出了本次循环,不会再执行print(i)。

continue 来提前跳出本次循环。

不仅要注意并体会break的缩进位置。还要体会print(i)的位置,可以把print(i)放在if语句上面,看看是什么效果。


规则变成7的倍数或者含7的数

现实中,报数游戏的规则往往要更复杂一些,比如7的倍数或者含7的数都要跳过。

比较运算: i % 7 == 0。只能表达 7的倍数这一个规则,所以,我们要介绍一种新的运算: 逻辑运算

逻辑运算符一共只有3个:andornot。它们的含义如下表格。


用python跳过第一行标题期初科目余额 python跳过本次循环_缩进_02


所以,我们可以使用 or 把

i % 7 ==0 是7的倍数

i % 10 == 0 个位是7

int(i / 10) % 10 == 7 十位是7

这3个比较运算的结果连接起来。表示只要其中1个是True,结果就是True。


for i in range(1,101):
    if i % 7 == 0 or i % 10 == 7 or int(i / 10) % 10 == 7 :
        continue
    print(i)



做一道练习题吧

一个正整数加上168之后是完全平方数,再加上168又是一个完全平方数。求这个数。

注: 完全平方数的题目在奥数里颇为常见,不仅是小学奥数,初中、高中奥数也经常看到完全平方数的身影,有兴趣的话可自行搜索。