先来了解一下什么是水仙花数。水仙花数是这样一个三位数:它的个位数、十位数、百位数的三次方之和,等于它自身。例如,153就是一个水仙花数,因为153=1^3+5^3+3^3。470也是一个水仙花数,因为470=4^3+7^3+0^3。

我们今天的任务就是,编程求100到999之间所有的水仙花数。

那么这个题目的关键就是,给定一个三位数abc,如何获得它的个位数c,十位数b,百位数a?

我们先来看第一种解决方案,也是最主流的解决方法:数位分离。

以153为例,我们先看,如何获得它的个位数3?只要%10就可以了:

153%10=3

通过模10运算,我们将个位数3分离了出来。

那么如何分离十位数5?先将十位数挪到个位,再利用%10,不就可以分离出来了吗?

通过除以10向下取整,可以将十位数挪到个位上来:

153//10=15

再利用模运算分离个位上的10即可:

15%10=5

这样我们就获得了十位数5.

同理,如果想得到153的百位数,将153除以100向下取整即可:

153 // 100 = 1

这就是数位分离的思想,先得到要验证的总数,再将各个位数分离出来。

代码实现如下:

for num in range(100,1000):

hundred=num//100

ten=(num//10)%10

single=num%10

if num==hundred**3+ten**3+single**3:

print('%d是一个水仙花数'%num)

这种方法逻辑很清晰,不过若是没见过这种解法的人,第一次怕是想不到数位分离的方法。其实,初学者更容易理解顺向思维的解法。

设个位数为a,十位数为b,百位数为c,则总数为a+10b+100c

判断a^3+b^3+c^3 == a+10b+100c即可。

for a in range(10):

for b in range(10):

for c in range(1,10):

sum = a + 10*b + 100*c

if a**3 + b**3 + c**3 == sum:

print("%d是一个水仙花数"%sum)

还有一种方法,可以利用字符串的特性,轻松地实现三个位数上的提取:

先将这个三位数转换成字符串,通过下标就可以提取个位、十位、百位数。再将提取出的字符转换成int型即可。

代码如下:

for num in range(100,1000):

s=str(num)

hundred=int(s[0])

ten=int(s[1])

digit=int(s[2])

if num==hundred**3+ten**3+digit**3:

print(num)

更多推荐

水仙花数python代码多种方式_水仙花数的三种解决方法(Python实现)