寻找水仙花数,要求:寻找出在100到1000范围内的左右水仙花数。
PS:如果一个3位数等于其各位数字的立方和,则这个数被称为水仙花数。例如153=1^3+5^3+3^,因此153是一个水仙花数。
详细的解释和思路都在注释中,如有纰漏或不足之处,希望大家不吝赐教。
def Find(x1, x2):
list2 = [] #list2为存放所有水仙花数的列表,此处为初始化。另由于list2在最后要输出,所以应为全局变量
for a in range(x1, x2): #大循环,循环范围即需要查找水仙花数的范围
CopyNum = a #CopyNum是用来和result(即每位数的立方和)做比较的。相同即是水仙花数。由于a在循环中会发生变化,所以在循环外先复制了a,以便在循环结束后能与result比较。
list1 = [] #list1为存放每一位数字的列表,在循环结束后就没啥用了,所以定义成了局部变量。这里是初始化。
while a>10: #当a>10时,说明该数还没有除到个位上,应继续循环。
b = a % 10 #除10取余,b是最低位的那个数
a = a // 10 #除10取商(向下取整),a是把最低位摘掉后剩下的数
list1.append(b) #把每次除出来的数放到list1中,这样就实现了把多位数拆成单独的数字的功能
list1.append(a) #别忘了除到最后a<10时,a为原来的最高位,也要放到list1中,不然拆开的数会缺最高位
list1.reverse() #列表中的数是由最低位排到最高位的,这里翻转,由最高位排到最低位,符合正常的阅读习惯
result = 0 #result为各位数的立方和,这里先把它初始化。循环外用不到result,所以定义成局部变量就行。
for x in list1: #遍历list1,即一个数的每一位数,进行立方和运算
result = result + x**3
if result == CopyNum: #如果立方和result等于最开始输入的a(CopyNum是a的副本),则为水仙花数。
list2.append(result) #把水仙花数放入list2中
print('该范围内共有%d个水仙花数,分别为:' %len(list2))
print(list2) #输出所有水仙花数
Find(100, 100000)