鱼C论坛

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

[已解决]水仙花数疑问(2个问题)

[复制链接]
发表于 2017-8-25 10:46:47 | 显示全部楼层 |阅读模式

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

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

x
初学者提问
问题1:
         “sum = sum + (temp%10) ** 3
        temp //= 10         # 注意这里要使用地板除哦~

         这一段什么意思,不明白,求帮忙解释!!,为什么这样做就是水仙花数了。

for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
        sum = sum + (temp%10) ** 3
        temp //= 10         # 注意这里要使用地板除哦~
    if sum == i:
        print(i)

问题2:
         这是单纯用for语句的话,还好理解,while那段相比是不是效率低些?,

for a in range(1,10):
    for b in range(0,10):
        for c in range(0,10):
            if (a*100 + b*10 +c) == a**3+b**3+c**3:
                print(a*100 + b*10 +c)
最佳答案
2017-8-25 10:58:05
问题1:
         “sum = sum + (temp%10) ** 3
        temp //= 10         # 注意这里要使用地板除哦~
         这一段什么意思,不明白,求帮忙解释!!,为什么这样做就是水仙花数了。

以数字123为例。
第一次循环
sum = sum + (temp%10) ** 3 #temp =123 ,temp % 10 = 3,sum = 0 + 3**3
temp //= 10  #temp = 12
第二次循环
sum = sum + (temp%10) ** 3 #temp =12 temp % 10 = 3, sum = 0 + 3**3 +2**3
temp //= 10 #temp = 1
第三次循环
sum = sum + (temp%10) ** 3 #temp =1 temp % 10 = 3, sum = 0 + 3**3 +2**3 +1**3
temp //= 10 #temp = 0
问题2:两个的for循环次数都是900,但程序1还要while循环3次,效率不如程序2高,但程序1主要是讲如何从一个整数中取出每位数字的方法。
另程序2的a,b,c的立方的范围是0~9可以在循环外算出,不必在循环中每次都重复计算,效率会更高。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-8-25 10:58:05 | 显示全部楼层    本楼为最佳答案   
问题1:
         “sum = sum + (temp%10) ** 3
        temp //= 10         # 注意这里要使用地板除哦~
         这一段什么意思,不明白,求帮忙解释!!,为什么这样做就是水仙花数了。

以数字123为例。
第一次循环
sum = sum + (temp%10) ** 3 #temp =123 ,temp % 10 = 3,sum = 0 + 3**3
temp //= 10  #temp = 12
第二次循环
sum = sum + (temp%10) ** 3 #temp =12 temp % 10 = 3, sum = 0 + 3**3 +2**3
temp //= 10 #temp = 1
第三次循环
sum = sum + (temp%10) ** 3 #temp =1 temp % 10 = 3, sum = 0 + 3**3 +2**3 +1**3
temp //= 10 #temp = 0
问题2:两个的for循环次数都是900,但程序1还要while循环3次,效率不如程序2高,但程序1主要是讲如何从一个整数中取出每位数字的方法。
另程序2的a,b,c的立方的范围是0~9可以在循环外算出,不必在循环中每次都重复计算,效率会更高。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-8-25 11:02:50 | 显示全部楼层
问题一:
temp % 10得到的就是最低位的数字,然后把这个数字取立方,算入总和sum中。
temp //= 10 就是说temp = temp //10,这个就相当于是把最低位的数字抛弃,倒数第二位变成最低位,然后就可以重复用上面那一句,temp % 10 又得到最后一位数字(也就是倒数第二位的数字),再重复。
论坛里有一个更为详细的帖子,你可以参考http://bbs.fishc.com/thread-93848-1-1.html

问题二:
关于效率的话你可以去看看数据结构方面的课程或者资料。
我其实学的不太好哈哈。。但是我记得这个多层嵌套循环涉及一个时间复杂度的次方的问题。
比如说你for里面的语句要用t时间去运行,你套了三层循环,那么就要花t^3次方去执行,如果这道题是一个求4位的,求5位的,你就要套4层,5层,那么你就要花 t^4 t^5这么些时间去执行
我们知道指数越大,这个数字增长的肯定是非常大的。
所以我个人觉得上面那个要好一点,同样的情况,求4位,5位,不需要再套一层循环,代码上也更简洁。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-25 12:25:31 | 显示全部楼层
1,首先你知道什么叫水仙花数吗?
2,知道水仙花数的计算方式吗?
知道这2点,就不可能不明白,学习首先要知道原理,要不拿个代码谁也不知道怎么回事
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-31 15:53:52 | 显示全部楼层
水仙花数小甲鱼老师代码解析
http://bbs.fishc.com/thread-95634-1-1.html
(出处: 鱼C论坛)

我自己整理了一个帖子,里面有具体的每个过程循环结果。有什么问题可以留言一起探讨下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 20:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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