鱼C论坛

 找回密码
 立即注册
查看: 9586|回复: 23

[技术交流] Python:问题贴之水仙花数

[复制链接]
发表于 2020-2-4 15:05:42 | 显示全部楼层
bluesky0476 发表于 2020-1-30 19:09
看了半天,明白了,以下是我的理解,为了便于读懂,写得比较详细----------

i在range(100,1000)中,为 ...

还是不理解 你说的第3步, 第三步 就是取 百位 和十位的数据吗? 又为什么是往左移动一位?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 16:07:02 | 显示全部楼层
纠结一天一夜,顿悟了。
*********************************************
for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
        sum = sum + (temp%10) ** 3
        temp //= 10         # 注意这里要使用地板除哦~
    if sum == i:
        print(i)
******************************************
     sum = sum + (temp%10) ** 3 这个表达式中,temp%10 是为了取得 个位数值(以153为例子),取得了个位数的3
然后将  3  立方后,给sum。 sum=0+3*3=27
      此时,还在整个while 循环体中,需要继续执行   temp //= 10 。 整个表达式为为了将 153,变成 15,3两部分(即:把一个三位数百位、十位与个位分开,变成2个部分,15,3)。现在再数值上,temp=15, 而这个15,再 while temp:中,为真,则这个循环还要继续执行。而,此时因为是继续前面的步骤(此时并不是完全重新开始,而是继续完成前面取值153这个数字,没有完成的循环),此时的temp是15,执行 temp%10 ,取到的值为5(这点特别注意,此时取得的5,其实是 153中的 十位 ,5。了解水仙花的定义可知道,这个十位是目前我们需要的数字就可以了。)现在将 十位的5 进行立方,的到125,此时,sum会进行  sum = sum + (temp%10) ** 3 指令(sum=27(由前面3*3得来)+(15%10)*3=27+125),
   需要注意此时已经不知不觉 将  153中的 个位数3  ,十位数  5,分别进行了 立方计算。并且将2者的立法和 赋值给了 变量 sum
同时,当temp=15时,仍需要执行  temp//=10,此时,temp=1(这是取整)
从而又重新执行 while temp:(因为此时 temp=1,while 语句为真,可执行)
此时 temp=1 ,要知道 1其实是 153 的百位数值。   1%10  此时的余数1(好像小学知识,我也记得了,但应该是这个意思),从而执行 sum=(27+125)+1*3    需要注意 此时 已经将 1,5,3 都分别立方了。
这里面  sum=sum+(temp%10)*3 其实也执行了三次,有点迭代跟新的意思,具体是怎么个逻辑 我说不清,但理解应该是这样子的
此时循环体还需要执行, temp=1  所以 当执行 temp//=10 时候,得到的结果是  0,余1(小学知识,我也忘记了)  好了!此时的temp=0了(前面的地板刷不是取整的意思吗,就是 0)
当最新的temp=0时,while temp:为假。不执行后面的循环。
一直到这个地方!!!!!!while 语句才算停止循环。所以 执行 while 后面的指令  if sum == i:
要知道  temp 是从153 算的,而 temp=i,      sum现在的数值就是 3*3+5*3+1*3=153     if成立,所以 输出。 如此循环。

好了, 对不对 都点个赞吧 。我也是想烂脑袋才看懂的。   


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-19 03:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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