接上题:自幂数是指一个n位数,它的每个位上的数字的n次幂之和等于它本身。比如=1**3+5**3+3**3,是一个3位数的自幂数,也称水仙花数。
求所有的水仙花数。
求水仙花的循环逻辑很简单,range(,0),即从到。
但如何获取个位,十位,百位上的数字则需要灵活应用之前的知识。
个位:n%10,即数字除以10的余数。
十位:int(n/10)%10,即数字除以10的整数部分,再除以10的余数。
百位:int(n/),即数字除以的整数部分。
forninrange(,0):
i=int(n/)
j=int(n/10)%10
k=n%10
ifn==i**3+j**3+k**3:
print(n)
在这道题中,确定了循环范围[,0)后,对范围内的每个数字都进行了判断。但现实中,往往还有2种不一样的情形
1碰到某个数字,循环直接结束。
2碰到某个或某些数字,跳过它(或它们)。
报数表演节目游戏
报数游戏是集体活动时经常会玩的一个游戏。
假设有个人,从1开始报数,碰到7的倍数跳过,如果没有跳过就惩罚他表演一个节目。
如果大家都是傻瓜
首先,如果只是个人报数,我们用print(i)表示把数字i报数出来。
那么程序如下
foriinrange(1,):
print(i)
程序执行,会在电脑屏幕上依次打印1,2,3,4,5,6,7,8……。
当我们制定游戏规则是逢7的倍数跳过后,如果某个人不小心报出了7的倍数,循环就应该提前结束。
假设这个人都是傻瓜,只会从1开始往后报数,那么当报到7的时候,游戏就结束了,就如下面的程序。
print(i)
ifi%7==0:
break
在python里,我们使用break来提前结束整个循环。
注意并体会break的缩进位置。
类似的例子还有判断一个数是不是素数(质数)。
比如,判断n=是不是素数。
n=
foriinrange(2,n):
ifn%i==0:
print(i)
print(nisnotaprimenumber)
break
循环的范围是[2,n),但如果我们在循环过程中找到一个数,可以整除n,那么n就已经不是素数了,后面的循环就没有必要继续下去了。所以,我们使用break提前结束了循环。
注意并体会break的缩进位置,可以把break换个位置,看看结果有什么不同。
如果大家都是聪明人
如果这个人都是聪明人,都不会犯错。碰到7的倍数都会跳过。
程序就变成了下面这样
continue
程序执行,电脑屏幕上会打印1,2,3,4,5,6,8……。
7的倍数都不会被打印。
原因在于,变量i从1开始循环,每次都会先判断i%7是否等于0。
如果i%7不等于0,才会执行print(i),把i打印出来。
如果i%7等于0,执行continue,就提前跳出了本次循环,不会再执行print(i)。
在python里,我们使用continue来提前跳出本次循环。
不仅要注意并体会break的缩进位置。还要体会print(i)的位置,可以把print(i)放在if语句上面,看看是什么效果。
规则变成7的倍数或者含7的数
现实中,报数游戏的规则往往要更复杂一些,比如7的倍数或者含7的数都要跳过。
在前面的程序里,if后面的判断条件,我们使用的是比较运算:i%7==0。只能表达7的倍数这一个规则,所以,我们要介绍一种新的运算:逻辑运算。
python里的逻辑运算符一共只有3个:and,or,not。它们的含义如下表格。
所以,我们可以使用or把
i%7==0是7的倍数
i%10==0个位是7
int(i/10)%10==7十位是7
这3个比较运算的结果连接起来。表示只要其中1个是True,结果就是True。
ifi%7==0ori%10==7orint(i/10)%10==7:
做一道练习题吧
一个正整数加上之后是完全平方数,再加上又是一个完全平方数。求这个数。
注:完全平方数的题目在奥数里颇为常见,不仅是小学奥数,初中、高中奥数也经常看到完全平方数的身影,有兴趣的话可自行搜索。