水仙花数的三种解决方法(Python实现)

先来了解一下什么是水仙花数。水仙花数是这样一个三位数:它的个位数、十位数、百位数的三次方之和,等于它自身。例如,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)

 

  • 26
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值