用现有知识求水仙花数,有点错误
本帖最后由 jcpython2 于 2022-7-2 16:06 编辑#求水仙花数
def flow(s):
while s <= 999:
s = str(s)
sa = list(s)
k = (int(sa)**3 + int(sa)**3 + int(sa)**3)
if k == int(s):
print(s,'非水仙花数')
int += 1
else:
print(s,'非水仙花数')
int += 1
flow(153)
报错 TypeError: 'type' object is not subscriptable
int str chr开始有点混乱了
另外如果我用
for i in range(999):
if 100 >= i <= 999:
这样求水仙花会否更高效? 但第一个报错我先不想这个了。。。。。。
附
老哥我的思路是用while循环
只要是len =3的都进入循环 (代码修改过这一步没写)
s是循环数 范围100-999 (代码修改过这一步没写)
然后把s转成list,再从list拆分后立方求和
k = (int(sa)**3 + int(sa)**3 + int(sa)**3)
如果求和等于当前循环数则为水仙花数
是否水仙花数都+=1 (这步错了)
当我发帖的时候才突然想起rangge(999)这个也行,但是不熟悉range连range(100,999)都忘记了
我知道有很多更加高效的方法解决这个问题,但我想从我自己的代码错误中找出我的错误,而不是单纯的知道怎么生成水仙花数,因为我感觉有时候同样的效果,我写的效率不高,但是我能理解,优化效率现在不是我优先考虑的,我想先熟记代码使用逻辑 能不能讲下你的思路 #求水仙花数
def Number_of_daffodils():
for n in range(100,1000):#循环n从100开始自加到999
i = n // 100 #//可以在求商的同时自动去掉小数,例如153//100 == 1
#因为i是百位数,去掉小数避免出现百位数为1.53的尴尬问题
j = n // 10 % 10#j为十位数 例如153//10 == 15 若要求十位数 则15%10余5便为十位数
k = n % 10 #同上
if n == i ** 3 + j ** 3 + k ** 3:#判断如果n为个十百的3次方相加则print
print (n)
Number_of_daffodils()
159662-会稽 发表于 2022-7-2 12:56
能不能讲下你的思路
老哥我的思路是用while循环
只要是len =3的都进入循环 (代码修改过这一步没写)
s是循环数 范围100-999 (代码修改过这一步没写)
然后把s转成list,再从list拆分后立方求和
k = (int(sa)**3 + int(sa)**3 + int(sa)**3)
如果求和等于当前循环数则为水仙花数
是否水仙花数都+=1 (这步错了)
当我发帖的时候才突然想起rangge(999)这个也行,但是不熟悉range连range(100,999)都忘记了
我知道有很多更加高效的方法解决这个问题,但我想从我自己的代码错误中找出我的错误,而不是单纯的知道怎么生成水仙花数,因为我感觉有时候同样的效果,我写的效率不高,但是我能理解,优化效率现在不是我优先考虑的,我想先熟记代码使用逻辑
所以老哥能看看我的代码怎么修改正常吗 159662-会稽 发表于 2022-7-2 13:15
老哥你的代码简洁优雅高效,这是我心中最佳答案,但因为我还有部分疑问(4楼),稍后再设置为最佳答案,这帖先不关闭 159662-会稽 发表于 2022-7-2 13:15
老哥我彻底弄懂了你的代码,你这是把153用运算符拆分出1、5、3实在太牛了,我的思路还停留在常规循环+1验证的阶段,你这个方法对于你来说可能是常用的逻辑,但对于我来说是全新的,打开了新大门,你中间这个算法我写进了笔记,这用运算符把数拆出来,我看我数学差,也不会想到 jcpython2 发表于 2022-7-2 16:04
老哥我的思路是用while循环
只要是len =3的都进入循环 (代码修改过这一步没写)
其他的应该没错
#求水仙花数#你的代码修改后
def flow(s=100):
while s <= 999:
s = str(s)
sa = list(s)
k = (int(sa)**3 + int(sa)**3 + int(sa)**3)
if k == int(s):
print(s,'是水仙花数')#这里Python给的错误提示是“类型”对象不可下标,因为你这里是中括号,应该改为小括号
s=int(s)#原本是中括号,我改过来了
s+= 1
else:
print(s,'非水仙花数')#这里打印非水仙花数也没必要,因为你一上机就会发现,
#它打印的大多就是非水仙花数,会淹没是水仙花数
s=int(s)
s+= 1
flow(100)#我看到你这里直接s=153,153本来就是水仙花数,这样做相当于人工判断水仙花数
我也刚学Python,也不是老哥级别,只是之前学过C语言的话学Python会简单很多{:10_256:} 懂了记得关贴,我困高高了(睡觉){:10_254:} 159662-会稽 发表于 2022-7-2 22:04
其他的应该没错
int += 1 这步写法错了,不能一步来,当初还以为这样高效节省,并且()用了[]
s = int(s)
s += 1
总体来说自我评价是兑现了自己构想的逻辑,并基础实现了,但是效率还差太远,小甲鱼的答案更是完全看不懂,此贴关闭,十课后回顾,感谢老哥 jcpython2 发表于 2022-7-3 13:08
int += 1 这步写法错了,不能一步来,当初还以为这样高效节省,并且()用了[]
这贴为啥没附件任何代码都变成全划线了………… def flow(s):
while s <= 999:
s1 = str(s)
sa = list(s1)
k = (int(sa) ** 3 + int(sa) ** 3 + int(sa) ** 3)
if k == int(s1):
print(s1, '水仙花数')
else:
print(s1, '非水仙花数')
s+=1
flow(153)
页:
[1]