鱼C论坛

 找回密码
 立即注册
查看: 2429|回复: 3

有一段代码实在看不懂?请鱼友帮助解答,感谢备注

[复制链接]
发表于 2021-5-19 23:32:48 | 显示全部楼层 |阅读模式

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

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

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)


这是求水仙花数的代码,实在是看不懂,哪位大神给一步步讲解下,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-19 23:44:11 | 显示全部楼层
这一段代码首先是一个for循环,i从100循环到了999.这就包括了所有的三位数字。
在循环之内呢,我们取一个数字做例子
比如,循坏到 i = 548时:
sum = 0
temp = i= 548
然后,进入while temp的循环当中(因为temp不为0)
sum = sum + (temp%10) ** 3 = 0 + (548%10)**3 = 0 + 8**3
(上一步就算上了个位数字的三次方)
然后temp = temp//10 = 54
然后继续while 循环,sum 有一次加上了4**3 四的三次方(十位数)
之后又会加上百位数的三次方

最后时判断,sum == i
sum就是个十位,百位三次方的和
是的话,就print
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-20 10:08:22 | 显示全部楼层
本帖最后由 Peteryo01223 于 2021-5-20 13:02 编辑
  1. for i in range(100, 1000):
  2. # 按题目,在100到1000间,每个三位数,Python 都看一遍,每次遍历的那一个三位数,被命名为了 i。命名为 each 也行,x 也行,符合 Python 的命名规范即可。
  3. # 在100到1000之间,一共900个三位数,即:循环 900 次。恰好,“for 语句”就是用于这类确定循环次数的情况,FishC 这里用 “for”来表达,很合适。

  4.     sum = 0
  5.     # sum,英文是“和”的意思。本程序,900次循环中,每次初始,第一步就是把它清零,否则前后不同的 i 的不同的个、十、百位的立方和 sum,都叠加在一起,就乱了。
  6.      
  7.     temp = i
  8.     # 每次的 i,先赋值给 temp(英文意思是:暂时),便于对 temp 这个数字进行仔细检查,同时保证 i 这个数字自身不改变。给 i 找了个替身 temp。

  9.     while temp:
  10.     # 这句话的意思是:while 后面不是 false,就持续地循环吧。具体到这一道题,意思是:只要 temp 不是零,就不断地做 while 循环。本题中,i 是个三位数,其实下面的程序,只会循环三次。如果你找的水仙花数是  10,000 到 100,000 之间五位(个、十、百、千、万)的数字,那么就会循环 5次,这段代码有很好的延展性,简单改一下,就适用。另外,多说一句,while 就是应用于这类“循环次数不确定”的情况,FishC 这里用 while,很合适,这里比用“for 语句”合适 。对比第一句的for,体会一下它俩的区别。

  11.         sum = sum + (temp%10) ** 3
  12.         # sum 开始叠加,每次都是“temp 除以10的余数”。第一次循环,这一句,取的是 temp 这个三位数的个位上那个数字,的立方。如:407,这里就是 (sum = 0 + 7*7*7) 的意思。
  13.         
  14.         temp //= 10
  15.         # 这句是每次 while 循环的最后一句,FishC 巧妙地把 temp 地板除 10。如果原来 temp 是407,那么这里就变成 40,如果原来 temp 是 40,那么这里就变成 4,如果原来 temp 是 4,这里就变成 0。这便于后面第二、三次循环中,分别再运行到上一句的时候,把 i 的十位和百位上的数字,都单独提出来,求立方。水仙花数的特性,简洁地通过这句和上一句,得以优雅地表达出来,很有艺术感。等到 while 尝试第四次循环时,temp (如:407)经过三次地板除10,temp 已经是 0 了,while 循环的先决条件消失,python 随即跳出 while,往下运行。

  16.     if sum == i:
  17.     # 最后,按照题目,如原数字等于个\十\百三位置的立方和,就说明 i 符合要求
  18.    
  19.         print(i)
  20.         # 打印结果
复制代码


参考题:一个五位的正整数,如果它的个、十、百、千、万位置上的数字的 5 次幂的和,等于这个数本身。请找出它们来。
答案如下:
改一下 range 括号里的范围 和 ** 后面的幂数,即可
  1. for i in range(10000, 100000):
  2.     sum = 0
  3.     temp = i
  4.     while temp:
  5.         sum = sum + (temp%10) ** 5      
  6.         temp //= 10
  7.     if sum == i:   
  8.         print(i)
复制代码

run后结果:
  1. 54748
  2. 92727
  3. 93084
  4. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-20 19:12:31 | 显示全部楼层
嘤嘤嘤我写的,参考一下
  1. print("一千以内的水仙花数为: ")
  2. for n in range(100, 1000):
  3.     hun = n // 100
  4.     ten = (n - hun * 100) // 10
  5.     ind = n % 10
  6.     m = hun**3 + ten**3 + ind**3
  7.     if n == m:
  8.         print("%d \t" %n, end="")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-25 02:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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