这个程序为什么运行不了,怎样才能得到绿色字体那样的输出结果
本帖最后由 风百默 于 2022-3-2 18:42 编辑def ramanujan(n):
results = []
for i in range(2,n+1):
import random
x,y,r,z=random.sample(range(1,i),k=4)
if x**3+y**3==r**3+z**3 and r**3+z**3==i:
results.append(i,' = ',x,'^3+',y,'^3 =', r,'^3+',z,'^3')
else:
continue
return results
for num in :
st = ramanujan(num)
for item in st:
print(item)
for num in :
st = ramanujan(num)
for item in st:
print(item) 本帖最后由 isdkz 于 2022-3-3 14:56 编辑
风百默 发表于 2022-3-3 13:47
谢谢,但我还是不明白我那样为什么错了?
首先,你得看题目要求,题目要求你用四个嵌套循环,
然后题目还要求 4 个不同的正整数,且 a^3 + b^3 = c^3 + d^3,除此之外没有别的要求了,
你的代码中的 r^3 + z^3 = i 很明显就不是题目要求,
还有就是这种情况很明显就要枚举,你用随机的话可能永远也算不出符合要求的那组数据,
最后,也就是你报错的地方,random模块的sample函数你传入了4就要从可迭代器中取四个样本,
而你的 i 却从2开始,也就是说当 i 为 2 时,你的 range(1, 2) 里面只有一个元素,总体少于样本,所以报错。
对你的代码修改如下,跟楼上大佬的代码差不多,只不过我加了一个 剪枝 处理。
剪枝,顾名思义,就是通过一些判断,砍掉搜索树上不必要的子树。
有时候,我们会发现某个结点对应的子树的状态都不是我们要的结果,
那么我们其实没必要对这个分支进行搜索,砍掉这个子树,就是剪枝
def ramanujan(n):
results = []
for x in range(1, n):
for y in range(1, n):
if y != x:
for r in range(1, n):
if r != x and r != y:
for z in range(1, n):
if z != x and z!= y and z!=r:
if (result := x**3+y**3) == r**3+z**3:
results.append(f"{result} = {x}^3 + {y}^3 = {r}^3 + {z}^3")
else:
continue
return results
st = ramanujan(20)
for item in st:
print(item) 哥哥呀球球发发代码,我们这样敲很累的{:10_266:} 大马强 发表于 2022-3-2 16:02
哥哥呀球球发发代码,我们这样敲很累的
抱歉,现在我加了代码了。 这样吗?但是要跑好久呀,
def ramanujan(n):
results = []
for x in range(1, n):
for y in range(1, n):
for r in range(1, n):
for z in range(1, n):
if x**3+y**3 == r**3+z**3:
results.append(
"%d^3 + %d^3 = %d^3 + %d^3" % (x, y, r, z))
else:
continue
return results
# for num in range(1000):
st = ramanujan(1729)
for item in st:
print(item) 大马强 发表于 2022-3-2 22:54
这样吗?但是要跑好久呀,
这样不对吧,x,y,r,z必须是不同的正整数,你那样循环xyzr可能都一样 风百默 发表于 2022-3-3 08:59
这样不对吧,x,y,r,z必须是不同的正整数,你那样循环xyzr可能都一样
哦哦,原来还有这个条件
那就加上判断
if x**3+y**3 == r**3+z**3 and x!=y and x!=r and x!=z and y!=r and y!= z and z!=r:
results.append("%d^3 + %d^3 = %d^3 + %d^3" % (x, y, r, z)) 2022-3-3 09:39
ж
大马强 发表于 2022-3-3 09:39
哦哦,原来还有这个条件
那就加上判断
这样还是不对吧,x,y,r,z题目要求必须是不同的正整数,你那样循环xyzr可能都一样 风百默 发表于 2022-3-3 10:07
这样还是不对吧,x,y,r,z题目要求必须是不同的正整数,你那样循环xyzr可能都一样
if的判断就是让他们两两不同呀
x!=y and x!=z and x!=r and y!=r and y!=z and r!=z 大马强 发表于 2022-3-3 10:22
if的判断就是让他们两两不同呀
x!=y and x!=z and x!=r and y!=r and y!=z and r!=z
谢谢,但我还是不明白我那样为什么错了? 麦八万吃了屎 本帖最后由 御修 于 2022-3-6 16:19 编辑
代码运行不了,用一下debug看一下晒哪里出问题了 isdkz 发表于 2022-3-3 14:52
首先,你得看题目要求,题目要求你用四个嵌套循环,
然后题目还要求 4 个不同的正整数,且 a^3 + b^ ...
这个改一下执行方式为什么就执行不了了? 本帖最后由 isdkz 于 2022-3-6 19:23 编辑
风百默 发表于 2022-3-6 18:47
这个改一下执行方式为什么就执行不了了?
因为你数据量太大了,函数一时半会儿执行不完,你改成这样就知道了
def ramanujan(n):
for x in range(1, n):
for y in range(1, n):
if y != x:
for r in range(1, n):
if r != x and r != y:
for z in range(1, n):
if z != x and z!= y and z!=r:
if (result := x**3+y**3) == r**3+z**3:
print(f"{result} = {x}^3 + {y}^3 = {r}^3 + {z}^3")
else:
continue
for num in :
ramanujan(num)
isdkz 发表于 2022-3-6 19:14
因为你数据量太大了,函数一时半会儿执行不完,你改成这样就知道了
那还有什么方法能按我这个数据这样输出吗? 风百默 发表于 2022-3-6 19:42
那还有什么方法能按我这个数据这样输出吗?
用四个嵌套循环估计不行,
2000的数据量,4个嵌套循环就要 2000 * 2000 * 2000 * 2000 = 16000000000000 次了,
即使做了剪枝运行的次数还是很多。更别说一万和十万的了,你那个一般人的电脑都跑不出结果
isdkz 发表于 2022-3-6 20:41
用四个嵌套循环估计不行,
2000的数据量,4个嵌套循环就要 2000 * 2000 * 2000 * 2000 = 160000000000 ...
好的谢谢
页:
[1]