鱼C论坛

 找回密码
 立即注册
查看: 1888|回复: 17

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

[复制链接]
发表于 2022-3-2 15:39:32 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 风百默 于 2022-3-2 18:42 编辑

-71a6e08b5d997412.jpg
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 [2000, 10000, 100000]:
        st = ramanujan(num)
        for item in st:
            print(item)
for num in [2000, 10000, 100000]:
        st = ramanujan(num)
        for item in st:
            print(item)
最佳答案
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) 里面只有一个元素,总体少于样本,所以报错。

对你的代码修改如下,跟楼上大佬的代码差不多,只不过我加了一个 剪枝 处理。

剪枝,顾名思义,就是通过一些判断,砍掉搜索树上不必要的子树。

有时候,我们会发现某个结点对应的子树的状态都不是我们要的结果,

那么我们其实没必要对这个分支进行搜索,砍掉这个子树,就是剪枝

  1. def ramanujan(n):
  2.     results = []
  3.     for x in range(1, n):
  4.         for y in range(1, n):
  5.             if y != x:
  6.                 for r in range(1, n):
  7.                     if r != x and r != y:
  8.                         for z in range(1, n):
  9.                             if z != x and z!= y and z!=r:
  10.                                 if (result := x**3+y**3) == r**3+z**3:
  11.                                     results.append(f"{result} = {x}^3 + {y}^3 = {r}^3 + {z}^3")
  12.                                 else:
  13.                                     continue
  14.     return results

  15. st = ramanujan(20)
  16. for item in st:
  17.     print(item)
复制代码

最佳答案

查看完整内容

首先,你得看题目要求,题目要求你用四个嵌套循环, 然后题目还要求 4 个不同的正整数,且 a^3 + b^3 = c^3 + d^3,除此之外没有别的要求了, 你的代码中的 r^3 + z^3 = i 很明显就不是题目要求, 还有就是这种情况很明显就要枚举,你用随机的话可能永远也算不出符合要求的那组数据, 最后,也就是你报错的地方,random模块的sample函数你传入了4就要从可迭代器中取四个样本, 而你的 i 却从2开始,也就是说当 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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) 里面只有一个元素,总体少于样本,所以报错。

对你的代码修改如下,跟楼上大佬的代码差不多,只不过我加了一个 剪枝 处理。

剪枝,顾名思义,就是通过一些判断,砍掉搜索树上不必要的子树。

有时候,我们会发现某个结点对应的子树的状态都不是我们要的结果,

那么我们其实没必要对这个分支进行搜索,砍掉这个子树,就是剪枝

  1. def ramanujan(n):
  2.     results = []
  3.     for x in range(1, n):
  4.         for y in range(1, n):
  5.             if y != x:
  6.                 for r in range(1, n):
  7.                     if r != x and r != y:
  8.                         for z in range(1, n):
  9.                             if z != x and z!= y and z!=r:
  10.                                 if (result := x**3+y**3) == r**3+z**3:
  11.                                     results.append(f"{result} = {x}^3 + {y}^3 = {r}^3 + {z}^3")
  12.                                 else:
  13.                                     continue
  14.     return results

  15. st = ramanujan(20)
  16. for item in st:
  17.     print(item)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 16:02:43 | 显示全部楼层
哥哥呀球球发发代码,我们这样敲很累的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-2 18:42:49 | 显示全部楼层
大马强 发表于 2022-3-2 16:02
哥哥呀球球发发代码,我们这样敲很累的

抱歉,现在我加了代码了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 22:54:33 | 显示全部楼层
这样吗?但是要跑好久呀,

  1. def ramanujan(n):
  2.     results = []
  3.     for x in range(1, n):
  4.         for y in range(1, n):
  5.             for r in range(1, n):
  6.                 for z in range(1, n):
  7.                     if x**3+y**3 == r**3+z**3:
  8.                         results.append(
  9.                             "%d^3 + %d^3 = %d^3 + %d^3" % (x, y, r, z))
  10.                     else:
  11.                         continue
  12.     return results


  13. # for num in range(1000):
  14. st = ramanujan(1729)
  15. for item in st:
  16.     print(item)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-3 08:59:43 | 显示全部楼层
大马强 发表于 2022-3-2 22:54
这样吗?但是要跑好久呀,

这样不对吧,x,y,r,z必须是不同的正整数,你那样循环xyzr可能都一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-3 09:39:50 | 显示全部楼层
风百默 发表于 2022-3-3 08:59
这样不对吧,x,y,r,z必须是不同的正整数,你那样循环xyzr可能都一样


哦哦,原来还有这个条件
那就加上判断
  1. 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:
  2.     results.append("%d^3 + %d^3 = %d^3 + %d^3" % (x, y, r, z))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-3 10:05:36 From FishC Mobile | 显示全部楼层
  2022-3-3 09:39

ж


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-3 10:07:51 | 显示全部楼层
大马强 发表于 2022-3-3 09:39
哦哦,原来还有这个条件
那就加上判断

这样还是不对吧,x,y,r,z题目要求必须是不同的正整数,你那样循环xyzr可能都一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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

谢谢,但我还是不明白我那样为什么错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-6 14:08:09 | 显示全部楼层
麦八万吃了屎
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-6 16:16:52 | 显示全部楼层
本帖最后由 御修 于 2022-3-6 16:19 编辑

代码运行不了,用一下debug看一下晒哪里出问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-6 18:47:29 | 显示全部楼层
isdkz 发表于 2022-3-3 14:52
首先,你得看题目要求,题目要求你用四个嵌套循环,

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

-2e66d0156e71cdc5.jpg
这个改一下执行方式为什么就执行不了了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-6 19:14:48 | 显示全部楼层
本帖最后由 isdkz 于 2022-3-6 19:23 编辑
风百默 发表于 2022-3-6 18:47
这个改一下执行方式为什么就执行不了了?


因为你数据量太大了,函数一时半会儿执行不完,你改成这样就知道了
  1. def ramanujan(n):
  2.     for x in range(1, n):
  3.         for y in range(1, n):
  4.             if y != x:
  5.                 for r in range(1, n):
  6.                     if r != x and r != y:
  7.                         for z in range(1, n):
  8.                             if z != x and z!= y and z!=r:
  9.                                 if (result := x**3+y**3) == r**3+z**3:
  10.                                     print(f"{result} = {x}^3 + {y}^3 = {r}^3 + {z}^3")
  11.                                 else:
  12.                                     continue

  13. for num in [50, 60, 70]:
  14.     ramanujan(num)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-6 19:42:38 | 显示全部楼层
isdkz 发表于 2022-3-6 19:14
因为你数据量太大了,函数一时半会儿执行不完,你改成这样就知道了

那还有什么方法能按我这个数据这样输出吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-6 20:41:09 | 显示全部楼层
风百默 发表于 2022-3-6 19:42
那还有什么方法能按我这个数据这样输出吗?

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

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

即使做了剪枝运行的次数还是很多。更别说一万和十万的了,你那个一般人的电脑都跑不出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-6 21:43:26 | 显示全部楼层
isdkz 发表于 2022-3-6 20:41
用四个嵌套循环估计不行,

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

好的谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 09:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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