鱼C论坛

 找回密码
 立即注册
查看: 1374|回复: 9

水仙花问题

[复制链接]
发表于 2018-3-5 10:41:26 | 显示全部楼层 |阅读模式

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

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

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)
我想问这个temp都属于 i 了
为什么在最底下
if sum ==temp
print(temp)
却不行呢,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-3-5 10:44:24 | 显示全部楼层
因为temp在while循环中被修改了,不再是原来的 i 值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-5 12:38:47 | 显示全部楼层
本帖最后由 Chase_Kas 于 2018-3-5 12:43 编辑

temp只是一个中间变量,用来计算十位和百位上的数字,并循环加入到sum中。
举个例子:
i = 153时,while第一次循环temp=15,while第二次循环temp=1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-5 12:40:57 | 显示全部楼层
for i in range(100, 1000):
    if i == ((i//100)**3) + (((i//10)%10)**3) + ((i%10)**3):
        print(i)
写个更简单的来解决水仙花问题,i//100是百位上的数字,(i//10)%10是十位上的数字,i%10是个位上的数字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-3-5 13:01:17 | 显示全部楼层
print([x*100+y*10+z for x in range(1,10) for y in range(10) for z in range(10) if x*100+y*10+z==x**3+y**3+z**3])
论坛某大佬写的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-5 15:45:06 | 显示全部楼层
  1. while temp:
  2.         sum = sum + (temp%10) ** 3
  3.         temp //= 10         # 注意这里要使用地板除哦~
复制代码

每次temp都是重新赋值的,i 等于第一次的temp,而templ在最后一次跳出来的值为0,所以跳出循环的I不等于0

下面的话引用BngThea的描述
我估计你感到困惑的应该是里面的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不是水仙花数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-5 15:54:25 | 显示全部楼层
因为最初temp变了,i没变。你可以插入print看一下每步的temp和i
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-6 03:12:42 | 显示全部楼层
Chase_Kas 发表于 2018-3-5 12:40
for i in range(100, 1000):
    if i == ((i//100)**3) + (((i//10)%10)**3) + ((i%10)**3):
        pr ...

你这个方法号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-6 03:20:58 | 显示全部楼层
Chase_Kas 发表于 2018-3-5 13:01
print([x*100+y*10+z for x in range(1,10) for y in range(10) for z in range(10) if x*100+y*10+z==x**3 ...

for x in range(1,10):
    for y in range(1,10):
        for z in range(1,10):
            if x*100+y*10+z ==x**3+y**3+z**3:
                print(x*100+y*10+z)
            
兄弟为什么我写完这个打印出来只有153   371呢
哪里错了么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-6 09:44:47 From FishC Mobile | 显示全部楼层
无情老兔兔 发表于 2018-3-6 03:20
for x in range(1,10):
    for y in range(1,10):
        for z in range(1,10):

range(1, 10)的范围是123456789,而十位和个位上数字可以是0啊!所以for y in range(10)  for z in range(10)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-28 08:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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