鱼C论坛

 找回密码
 立即注册
查看: 1107|回复: 4

[已解决]关于水仙花数的疑问

[复制链接]
发表于 2018-1-29 14:48:03 | 显示全部楼层 |阅读模式

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

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

x
我自己写的代码
  1. x=1
  2. y=1
  3. z=1
  4. num=100
  5. for num in range(100,999):
  6.     for z in range(1,10):
  7.         if num==x**3+y**3+z**3:
  8.             print('%d就是水仙花数'%num)
  9.             continue
  10.             for y in range(1,10):
  11.                 if num==x**3+y**3+z**3:
  12.                     print('%d就是水仙花数'%num)
  13.                     continue
  14.                     for x in range(1,10):
  15.                         if num==x**3+y**3+z**3:
  16.                             print('%d就是水仙花数'%num)
  17.                         else:
  18.                          x+=1
  19.                 else:
  20.                     y+=1
  21.         else:
  22.             z+=1
  23. num+=1
复制代码

小甲鱼的答案代码
  1. for i in range(100, 1000):
  2.     sum = 0
  3.     temp = i
  4.     while temp:
  5.         sum = sum + (temp%10) ** 3
  6.         temp //= 10         # 注意这里要使用地板除哦~
  7.     if sum == i:
  8.         print(i)
复制代码

为什么结果不一样,另外请高手帮我分析下小甲鱼的代码,没看懂!不是说要求个位十位百位都是3次幂吗?
最佳答案
2018-1-29 16:41:08
我估计你感到困惑的应该是里面的while循环
while temp:
        sum = sum + (temp%10) ** 3
        temp //= 10

temp % 10 得到的是temp这个值的个位数字,比如 111 % 10 == 1,234 % 10 == 4
(temp % 10) ** 3 表示这个数字的三次方,比如 2 ** 3 == 2 * 2 * 2 == 8
temp //= 10 表示temp右移1位,比如 123 // 10 == 12,234 // 10 == 23,地板除的意思是整除,只取整数部分而去掉小数部分

所以整个while循环的操作就是,拿temp=543举个例子
第一次循环
sum = 0 + 3 ** 3 = 9
temp = 54
第二次循环
sum = 9 + 4**3 = 9 + 64 = 73
temp = 5
第三次循环
sum = 73 + 5**3 = 73 + 125 = 198
temp = 0
第四次循环条件判定失败,跳出while循环,最终sum == 198
后续的判定中sum != 543
所以543不是水仙花数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-29 14:56:58 | 显示全部楼层
range(1,10)就有问题 还有0呢 水仙花数 看这里面的python代码 牛叉不
  1. for i in range(1,10):
  2.     for j in range(0,10):
  3.         for k in range(0,10):
  4.            if i*100+j*10+k==i**3+j**3+k**3:
  5.                 print(i*100+j*10+k)
复制代码

评分

参与人数 1鱼币 +2 收起 理由
bobfenglin + 2

查看全部评分

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

使用道具 举报

发表于 2018-1-29 15:27:21 | 显示全部楼层
本帖最后由 大麦miracle 于 2018-1-29 15:33 编辑
  1. for i in range(100, 1000):#i在100-1000循环
  2.     sum = 0
  3.     temp = i
  4.     while temp:#temp为真while一直循环比如temp=153
  5.         sum = sum + (temp%10) ** 3#sum=0+(153%10)**3第一次循环是3**3也就是27,[u]第二次训话(15%10)余5**3sum=27+125=152[/u][b]第三次循环sum=27+125+(1%10)**3=27+125+1=153[/b]
  6.         temp //= 10         # 注意这里要使用地板除哦~#这里面temp=153//10,地板除保留整数15temp=15返回继续循环,第二次循环temp=15//10=1返回执行第三次循环,然后temp=1//10等于0,退出循环
  7.     if sum == i:#如果sum=i比如153=153
  8.         print(i)#打印水仙花数[color=Red][/color]
复制代码

评分

参与人数 1鱼币 +2 收起 理由
bobfenglin + 2

查看全部评分

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

使用道具 举报

发表于 2018-1-29 16:41:08 | 显示全部楼层    本楼为最佳答案   
我估计你感到困惑的应该是里面的while循环
while temp:
        sum = sum + (temp%10) ** 3
        temp //= 10

temp % 10 得到的是temp这个值的个位数字,比如 111 % 10 == 1,234 % 10 == 4
(temp % 10) ** 3 表示这个数字的三次方,比如 2 ** 3 == 2 * 2 * 2 == 8
temp //= 10 表示temp右移1位,比如 123 // 10 == 12,234 // 10 == 23,地板除的意思是整除,只取整数部分而去掉小数部分

所以整个while循环的操作就是,拿temp=543举个例子
第一次循环
sum = 0 + 3 ** 3 = 9
temp = 54
第二次循环
sum = 9 + 4**3 = 9 + 64 = 73
temp = 5
第三次循环
sum = 73 + 5**3 = 73 + 125 = 198
temp = 0
第四次循环条件判定失败,跳出while循环,最终sum == 198
后续的判定中sum != 543
所以543不是水仙花数

评分

参与人数 1荣誉 +5 鱼币 +4 贡献 +3 收起 理由
bobfenglin + 5 + 4 + 3

查看全部评分

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

使用道具 举报

 楼主| 发表于 2018-1-29 17:08:11 | 显示全部楼层
sky 发表于 2018-1-29 14:56
range(1,10)就有问题 还有0呢 水仙花数 看这里面的python代码 牛叉不

代码写的好,不过没能给我解惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 14:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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