鱼C论坛

 找回密码
 立即注册
查看: 2529|回复: 15

[已解决]水仙花数问题完全弄懂

[复制链接]
发表于 2016-10-11 05:38:01 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 changhaitian 于 2017-1-6 05:23 编辑

for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
        sum = sum + (temp%10) ** 3 (请问这里是如何体现出 100a+10b+c = a**3+b**3+c**3)
        temp //= 10         
    if sum == i:
        print(i)

(水仙花数就是一个三位数等于其各位数字的立方和,如 153 = 1**3+5**3+3**3,题目是打印1000内的水仙花数)

我不知道理解的对不对:
  因为 sum =  0,所以,每次sum = sum + (temp%10)**3 也就是相当于a**3,b**3,c**3
然后需要重新把他们带入公式,所以就相当于 sum = a**3 + b**3 + c**3???
当我把365带入进去的时候,sum = sum + (temp%10)**3 和temp//10里面temp的值是一样的么?


时隔这么久,我还是没完全弄懂。
最佳答案
2016-10-13 07:52:28
本帖最后由 Kotori 于 2016-10-13 07:54 编辑

一个十进制数可能通过除以10取余数依次得到各个数位上的数。
sum = sum + (temp%10) ** 3 这一句是求这个数各个数位的三次方的和。到最后才判断这个和是否和原数i相同。
temp则是作为一个变量,每次提供最后一位数字。
举个例子,temp是153进入循环, (temp%10) ** 3 得到个位数3的三次方,同时进行对SUM的累加。
然后temp //= 10 地板除就相当于把这个数的最后一位去掉,得到15。
后面再进行循环就能依次取到5和1两个数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-13 04:17:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-13 07:52:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Kotori 于 2016-10-13 07:54 编辑

一个十进制数可能通过除以10取余数依次得到各个数位上的数。
sum = sum + (temp%10) ** 3 这一句是求这个数各个数位的三次方的和。到最后才判断这个和是否和原数i相同。
temp则是作为一个变量,每次提供最后一位数字。
举个例子,temp是153进入循环, (temp%10) ** 3 得到个位数3的三次方,同时进行对SUM的累加。
然后temp //= 10 地板除就相当于把这个数的最后一位去掉,得到15。
后面再进行循环就能依次取到5和1两个数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-13 14:35:38 | 显示全部楼层
sum = sum + (temp%10) ** 3    #比如temp=345 那么temp%10就等于5,除以10取余等于5
temp //= 10                             #比如temp=345 那么345除以10后等于34.5,取整等于34,意思是将最低位去除。
整体思路是:比如153,先将3取出来进行立方,然后再将15赋值给temp,在取出5进行立方,再取出1,进行立方最后求和
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-13 16:49:00 | 显示全部楼层
看懂了程序,但是没看懂原来是水仙花数问题
书读的太少啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-13 16:51:04 | 显示全部楼层
对10取余就是为了得到个位的数值;
地板除是为了吧不同位置的数字放到个位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-14 04:11:05 | 显示全部楼层
Kotori 发表于 2016-10-13 07:52
一个十进制数可能通过除以10取余数依次得到各个数位上的数。
sum = sum + (temp%10) ** 3 这一句是求这个 ...

谢谢解答,
但是我还是没懂sum在这里的作用,为什么sum = sum + xx呢?为什么不是sum = temp%10**3?
我一直都觉得100a+10b+c = a**3+b**3+c**3 不是 sum = sum1+sum2+sum3吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-14 04:14:20 | 显示全部楼层
PythonE 发表于 2016-10-13 14:35
sum = sum + (temp%10) ** 3    #比如temp=345 那么temp%10就等于5,除以10取余等于5
temp //= 10       ...

谢谢解答,思路能理解,但是没有懂公式的运作模式,没懂sum在这里的作用,为什么这里sum = sum + xx呢?为什么不是sum = temp%10**3?
我一直都觉得100a+10b+c = a**3+b**3+c**3 不是 sum = sum(a)+sum(b)+sum(c)吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-14 06:51:10 | 显示全部楼层
changhaitian 发表于 2016-10-14 04:14
谢谢解答,思路能理解,但是没有懂公式的运作模式,没懂sum在这里的作用,为什么这里sum = sum + xx呢? ...

题目中“水仙花数就是一个三位数等于其各位数字的立方和”
sum = sum + xx这里是累加,就是对其各位数字求立方和。
sum = temp%10**3是单个数字的立方。
循环中不如果不设置累加,则SUM的值就会改变为最后一个数字的立方。
另外,100a+10b+c = a**3+b**3+c**3,是个总的思路。
对原数进行100a+10b+c的分解是为了得到各个数字,以验证两者是否相等。
要在循环中实现累加,就是sum = sum +  temp%10**3。
如果是sum = sum(a)+sum(b)+sum(c)这样的思路,可能是定义sum(x)这个函数是求三次方的,再手动相加,比较。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-14 10:18:09 | 显示全部楼层
我的做法:


for i in range(100,1000):
      
       a=int(str(i)[0])**3
       b=int(str(i)[1])**3
       c=int(str(i)[2])**3
       if i==(a+b+c):
              print ('花',i)
             
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-14 10:18:40 | 显示全部楼层
我的做法:


for i in range(100,1000):
      
       a=int(str(i)[0])**3
       b=int(str(i)[1])**3
       c=int(str(i)[2])**3
       if i==(a+b+c):
              print ('花',i)
             
看这个就明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-10-15 04:22:53 | 显示全部楼层

大哥,谢谢提供思路!~\(≧▽≦)/~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-15 04:29:54 | 显示全部楼层
Kotori 发表于 2016-10-14 06:51
题目中“水仙花数就是一个三位数等于其各位数字的立方和”
sum = sum + xx这里是累加,就是对其各位数字 ...

谢谢你的耐心,我能够理解temp%10**3 是指,
提出这个数的各位数的立方,但是 temp// = 10 这里的作用真的没看懂!
去掉这个数的最后一位有什么用呢?是要再循环入sum = sum +(temp%|10)**3这个公式中吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-15 08:29:18 | 显示全部楼层
changhaitian 发表于 2016-10-15 04:29
谢谢你的耐心,我能够理解temp%10**3 是指,
提出这个数的各位数的立方,但是 temp// = 10 这里的作用真 ...

对的,因为循环中是求最后一位的三次方,并累加。
每次去掉最后一位,再进入循环就能依次取到每一位。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-20 21:41:45 | 显示全部楼层
Kotori 发表于 2016-10-14 06:51
题目中“水仙花数就是一个三位数等于其各位数字的立方和”
sum = sum + xx这里是累加,就是对其各位数字 ...

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

使用道具 举报

发表于 2016-10-20 23:09:30 | 显示全部楼层
PythonE 发表于 2016-10-13 14:35
sum = sum + (temp%10) ** 3    #比如temp=345 那么temp%10就等于5,除以10取余等于5
temp //= 10       ...

赞,终于弄懂了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 10:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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