鱼C论坛

 找回密码
 立即注册
查看: 2328|回复: 11

[已解决]用现有知识求水仙花数,有点错误

[复制链接]
发表于 2022-7-2 12:47:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jcpython2 于 2022-7-2 16:06 编辑
  1. #求水仙花数
  2. def flow(s):
  3.     while s <= 999:
  4.         s = str(s)
  5.         sa = list(s)
  6.         k = (int(sa[0])**3 + int(sa[1])**3 + int(sa[2])**3)
  7.         if k == int(s):
  8.             print(s,'非水仙花数')
  9.             int[s] += 1
  10.         else:
  11.             print(s,'非水仙花数')
  12.             int[s] += 1


  13. flow(153)
复制代码


报错 TypeError: 'type' object is not subscriptable

int str chr开始有点混乱了


另外如果我用
  1. for i in range(999):
  2.     if 100 >= i <= 999:
复制代码


这样求水仙花会否更高效? 但第一个报错我先不想这个了。。。。。。




老哥我的思路是用while循环

只要是len =3的都进入循环 (代码修改过这一步没写)
s是循环数 范围100-999 (代码修改过这一步没写)
然后把s转成list,再从list拆分后立方求和
        k = (int(sa[0])**3 + int(sa[1])**3 + int(sa[2])**3)
如果求和等于当前循环数则为水仙花数
是否水仙花数都+=1   (这步错了)

当我发帖的时候才突然想起rangge(999)这个也行,但是不熟悉range连range(100,999)都忘记了


我知道有很多更加高效的方法解决这个问题,但我想从我自己的代码错误中找出我的错误,而不是单纯的知道怎么生成水仙花数,因为我感觉有时候同样的效果,我写的效率不高,但是我能理解,优化效率现在不是我优先考虑的,我想先熟记代码使用逻辑
最佳答案
2022-7-2 13:15:35
  1. #求水仙花数
  2. def Number_of_daffodils():
  3.         for n in range(100,1000):#循环n从100开始自加到999
  4.             i = n // 100    #//可以在求商的同时自动去掉小数,例如153//100 == 1
  5.                             #因为i是百位数,去掉小数避免出现百位数为1.53的尴尬问题
  6.             j = n // 10 % 10#j为十位数 例如153//10 == 15 若要求十位数 则15%10余5便为十位数
  7.             k = n % 10      #同上
  8.             if n == i ** 3 + j ** 3 + k ** 3:#判断如果n为个十百的3次方相加则print
  9.                 print (n)
  10. Number_of_daffodils()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-2 12:56:12 | 显示全部楼层
能不能讲下你的思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-2 13:15:35 | 显示全部楼层    本楼为最佳答案   
  1. #求水仙花数
  2. def Number_of_daffodils():
  3.         for n in range(100,1000):#循环n从100开始自加到999
  4.             i = n // 100    #//可以在求商的同时自动去掉小数,例如153//100 == 1
  5.                             #因为i是百位数,去掉小数避免出现百位数为1.53的尴尬问题
  6.             j = n // 10 % 10#j为十位数 例如153//10 == 15 若要求十位数 则15%10余5便为十位数
  7.             k = n % 10      #同上
  8.             if n == i ** 3 + j ** 3 + k ** 3:#判断如果n为个十百的3次方相加则print
  9.                 print (n)
  10. Number_of_daffodils()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-2 16:04:08 | 显示全部楼层
159662-会稽 发表于 2022-7-2 12:56
能不能讲下你的思路

老哥我的思路是用while循环

只要是len =3的都进入循环 (代码修改过这一步没写)
s是循环数 范围100-999 (代码修改过这一步没写)
然后把s转成list,再从list拆分后立方求和
        k = (int(sa[0])**3 + int(sa[1])**3 + int(sa[2])**3)
如果求和等于当前循环数则为水仙花数
是否水仙花数都+=1   (这步错了)

当我发帖的时候才突然想起rangge(999)这个也行,但是不熟悉range连range(100,999)都忘记了


我知道有很多更加高效的方法解决这个问题,但我想从我自己的代码错误中找出我的错误,而不是单纯的知道怎么生成水仙花数,因为我感觉有时候同样的效果,我写的效率不高,但是我能理解,优化效率现在不是我优先考虑的,我想先熟记代码使用逻辑


所以老哥能看看我的代码怎么修改正常吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-2 16:06:19 | 显示全部楼层

老哥你的代码简洁优雅高效,这是我心中最佳答案,但因为我还有部分疑问(4楼),稍后再设置为最佳答案,这帖先不关闭
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-2 16:30:41 | 显示全部楼层

老哥我彻底弄懂了你的代码,你这是把153用运算符拆分出1、5、3实在太牛了,我的思路还停留在常规循环+1验证的阶段,你这个方法对于你来说可能是常用的逻辑,但对于我来说是全新的,打开了新大门,你中间这个算法我写进了笔记,这用运算符把数拆出来,我看我数学差,也不会想到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-2 22:04:20 | 显示全部楼层
jcpython2 发表于 2022-7-2 16:04
老哥我的思路是用while循环

只要是len =3的都进入循环 (代码修改过这一步没写)

其他的应该没错
  1. #求水仙花数#你的代码修改后
  2. def flow(s=100):
  3.     while s <= 999:
  4.         s = str(s)
  5.         sa = list(s)
  6.         k = (int(sa[0])**3 + int(sa[1])**3 + int(sa[2])**3)
  7.         if k == int(s):
  8.             print(s,'是水仙花数')#这里Python给的错误提示是“类型”对象不可下标,因为你这里是中括号,应该改为小括号
  9.             s=int(s)#原本是中括号,我改过来了
  10.             s+= 1
  11.         else:
  12.             print(s,'非水仙花数')#这里打印非水仙花数也没必要,因为你一上机就会发现,
  13.             #它打印的大多就是非水仙花数,会淹没是水仙花数
  14.             s=int(s)
  15.             s+= 1


  16. flow(100)#我看到你这里直接s=153,153本来就是水仙花数,这样做相当于人工判断水仙花数
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-2 22:06:54 | 显示全部楼层
我也刚学Python,也不是老哥级别,只是之前学过C语言的话学Python会简单很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-2 22:25:41 | 显示全部楼层
懂了记得关贴,我困高高了(睡觉)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-3 13:08:24 | 显示全部楼层








int += 1 这步写法错了,不能一步来,当初还以为这样高效节省,并且()用了[]

  1. s = int(s)
  2.             s += 1
复制代码


总体来说自我评价是兑现了自己构想的逻辑,并基础实现了,但是效率还差太远,小甲鱼的答案更是完全看不懂,此贴关闭,十课后回顾,感谢老哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-3 13:09:44 | 显示全部楼层
jcpython2 发表于 2022-7-3 13:08
int += 1 这步写法错了,不能一步来,当初还以为这样高效节省,并且()用了[]

这贴为啥没附件任何代码都变成全划线了…………
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-22 19:33:44 | 显示全部楼层
def flow(s):
    while s <= 999:
        s1 = str(s)
        sa = list(s1)
        k = (int(sa[0]) ** 3 + int(sa[1]) ** 3 + int(sa[2]) ** 3)
        if k == int(s1):
            print(s1, '水仙花数')
        else:
            print(s1, '非水仙花数')
        s+=1
flow(153)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 19:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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