今天,我们来和大家探讨一个入门级的话题:使用Python打印输出"水仙花数"
水仙花
所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
要用到公式
如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
01方法一:for循环打印输出(三位数组合遍历)
【思路】三位数中,每一位数的范围应该是0-9之间的数。我们遍历三位数中的每一位数字,当数字组合成三位数时符合水仙花数的条件时,将该数字打印输出。代码如下:
for循环打印输出水仙花数
for i in range(1,10):
for j in range(0,10):
for k in range(0,10):
if i*100+j*10+k==i**3+j**3+k**3:
print(i*100+j*10+k)
实现了
这样,我们可以轻松实现。具体输出如下:
>>>
153
370
371
407
那么,还有没有别的方法呢?答案是肯定的!往下看……
02方法二:for循环打印输出(三位数直接遍历)
上面是把三位数各个位数单独拿出来进行遍历,这样的话会有很多重复的组合,浪费时间(很难察觉),有没有好一点的for循环方案呢?
【思路】我们直接从100-999这些三位数中,将每个数字中个位、十位、百位数提取出来,按照水仙花数规则,将符合条件的三位数筛选出来即可。
代码如下:
for循环打印的另一种方式
for n in range(100,1000):
i = n // 100
j = n // 10 % 10
k = n % 10
if n == i ** 3 + j ** 3 + k ** 3:
print(n)
同样可以实现。
03方法三:for循环打印输出(三位数转化字符串遍历)
【思路】对于一个三位数是可以转化为字符串类型的,遍历转化后的每一个字符,将字符再转化为整数后,求各位的立方和,然后同三位数比较,如果相等则打印输出即可。
for循环遍历的另一种方式
for n in range(100,1000):
s = str(n)
sum_num = 0
for i in s:
sum_num += int(i) ** 3
if sum_num == n:
print(n, end='')
这种方式也可以实现同样的效果。
04方法四:更加Pythonic表示
【思路】我们把方法三中的写法变得更加Pythonic一点
来看下代码:
另一种表示
for i in range(100,1000):
if sum(pow(int(d), 3) for d in str(i)) == i:
print(i, end='\t')
轻松实现效果。为了避免重复代码,上述代码中截图有可能和后面代码内容不一致;再者,贴上代码方便大家复制粘贴测试,截图方便代码对齐。
05这就完了?
这还远远不够,我们知道,水仙花数是自幂数的一种,它也叫阿姆斯特朗数。对于自幂数的打印输出,还有很多内容哦,如何使用Python实现呢?我们下一篇内容会有所涉及,大家关注我,后续提供更加精彩的内容。
欢迎大家留言讨论,转载请注明出处,百家号:Python高手养成。