鱼C论坛

 找回密码
 立即注册
查看: 2231|回复: 8

水仙花数的代码看不太懂,请帮忙解释一下吧

[复制链接]
发表于 2020-12-30 09:45:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
for i in range(100,1000):
    sum = 0
    temp = i
    while temp:
        sum = sum + (temp % 10) ** 3
        temp //= 10
    if sum == i:
        print(i)


我现在知道这个代码是怎么运行的,但是这个代码怎么与这个公式 153=1^3+5^3+3^3 等价呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-30 10:15:51 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-12-30 10:31 编辑

将 153 拆分成百位、十位、个位上的数,再分别求其立方,判断三个立方和是否等于该数,若是就是水仙数花,若相等就不是水仙花数

就153而言:1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153

下一个水仙花数是 370 = 3^3 + 7^3 +0^3 = 27 + 343 + 0

371 =  3^3 + 7^3 +1^3 = 27 + 343 + 1

407 = 4^3 + 0^3 +7^3 = 64 + 0 + 343

1000 以内就这四个水仙花数

将循环变量赋给 temp,然后 temp % 10 取得个位上的数,将该数求立方后赋给 sum,再将 temp 除 10,便是取十位上的数,立方后与之前的个位上的立方相加,再一次除 10,就是取百位上的数,立方后与 sum (此时的和是个位与十位上的数的立方和)相加,于是,便求得了三个位上的立方和
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-30 10:26:12 | 显示全部楼层
for i in range(100, 1000):#遍历100到1000所有整数
   sum = 0  #定义求和变量,初值为0
   temp = i 
   while temp:#当i得值不等于0时,一直循环
       sum = sum + (temp%10) ** 3 #temp取余10得到最后一位的数值,sum等于temp各位数之和
       temp //= 10         # 注意这里要使用地板除 这里得到temp的前两位
   if sum == i: #判断i是否等于其各位数的三次方之和
       print(i)#打印满足情况的i得值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-30 10:57:08 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-30 14:03 编辑
for i in range(100,1000):
    sum = 0                             # sum 用于在内循环中累加,开始前,先对其清 0
    temp = i                            # i 在内循环中需要修改, 而 i 还有用,所以增加临时变量 temp 代替 i
    while temp:                         # 内循环入口,只要 temp 不为 0 值就开始或继续循环
        sum = sum + (temp % 10) ** 3    # 取出 temp 的个位数求取立方后与 sum 累加
        temp //= 10                     # temp = temp // 10 , 个位数被舍弃。其效果,temp 向右移动一个 10 进制位,比如,139,右移 1 位后,成为 13,9 被舍弃 
    if sum == i:                        # 循环结束,如果 i 的个、十、百位数的立方和与 i 相等
        print(i)                        # i 就是一个"水仙花数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-30 14:01:15 | 显示全部楼层
明白了,谢谢大家的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-12 00:52:10 From FishC Mobile | 显示全部楼层
这个原理就是把100到1000内,从100开始每次增一个单位的三次方 比如1001**3第二个是100加2**3 以此类推,所有数据完毕后!再跟sum也就是和对比,是的就打印出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-23 18:44:56 | 显示全部楼层
sum = sum + (temp % 10) ** 3   
temp //= 10


这两句为什么不能合成一句呢?
sum == int(temp%10)**3 + int(temp%100)**3 + int(temp/10%10)**3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-19 23:47:57 | 显示全部楼层
你看这样 能不能看懂
for x in range(1,9):
       for y in range(0,9):
              for z in range
              (0,9):
                     if x*100 + y*10 + z == x**3 + y**3 + z**3:
                            print(x*100 + y*10 + z)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-19 23:48:45 | 显示全部楼层
小时候可帅了 发表于 2021-4-19 23:47
你看这样 能不能看懂
for x in range(1,9):
       for y in range(0,9):

复制的有问题 ,大概就是这样 感觉能好理解些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 00:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表