风百默 发表于 2022-3-2 15:39:32

这个程序为什么运行不了,怎样才能得到绿色字体那样的输出结果

本帖最后由 风百默 于 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-2 15:39:33

本帖最后由 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)

大马强 发表于 2022-3-2 16:02:43

哥哥呀球球发发代码,我们这样敲很累的{:10_266:}

风百默 发表于 2022-3-2 18:42:49

大马强 发表于 2022-3-2 16:02
哥哥呀球球发发代码,我们这样敲很累的

抱歉,现在我加了代码了。

大马强 发表于 2022-3-2 22:54:33

这样吗?但是要跑好久呀,

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-3 08:59:43

大马强 发表于 2022-3-2 22:54
这样吗?但是要跑好久呀,

这样不对吧,x,y,r,z必须是不同的正整数,你那样循环xyzr可能都一样

大马强 发表于 2022-3-3 09:39:50

风百默 发表于 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 10:05:36

2022-3-3 09:39

ж


风百默 发表于 2022-3-3 10:07:51

大马强 发表于 2022-3-3 09:39
哦哦,原来还有这个条件
那就加上判断

这样还是不对吧,x,y,r,z题目要求必须是不同的正整数,你那样循环xyzr可能都一样

大马强 发表于 2022-3-3 10:22:01

风百默 发表于 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 13:47:09

大马强 发表于 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 14:08:09

麦八万吃了屎

御修 发表于 2022-3-6 16:16:52

本帖最后由 御修 于 2022-3-6 16:19 编辑

代码运行不了,用一下debug看一下晒哪里出问题了

风百默 发表于 2022-3-6 18:47:29

isdkz 发表于 2022-3-3 14:52
首先,你得看题目要求,题目要求你用四个嵌套循环,

然后题目还要求 4 个不同的正整数,且 a^3 + b^ ...


这个改一下执行方式为什么就执行不了了?

isdkz 发表于 2022-3-6 19:14:48

本帖最后由 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)

风百默 发表于 2022-3-6 19:42:38

isdkz 发表于 2022-3-6 19:14
因为你数据量太大了,函数一时半会儿执行不完,你改成这样就知道了

那还有什么方法能按我这个数据这样输出吗?

isdkz 发表于 2022-3-6 20:41:09

风百默 发表于 2022-3-6 19:42
那还有什么方法能按我这个数据这样输出吗?

用四个嵌套循环估计不行,

2000的数据量,4个嵌套循环就要 2000 * 2000 * 2000 * 2000 = 16000000000000 次了,

即使做了剪枝运行的次数还是很多。更别说一万和十万的了,你那个一般人的电脑都跑不出结果

风百默 发表于 2022-3-6 21:43:26

isdkz 发表于 2022-3-6 20:41
用四个嵌套循环估计不行,

2000的数据量,4个嵌套循环就要 2000 * 2000 * 2000 * 2000 = 160000000000 ...

好的谢谢
页: [1]
查看完整版本: 这个程序为什么运行不了,怎样才能得到绿色字体那样的输出结果