You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Project Euler毕达哥拉斯三元组求解Python代码无结果求助

核心错误排查

你的代码变量推导逻辑完全错误,是找不到答案的根本原因:

  • 内层循环中a = c - b的写法完全不符合和为1000的约束:你在外层定义c = 1000 -k,内层又写b = c -i,代入后a = i,此时a + b + c = i + (c -i) + c = 2c,只有c=500时和才可能为1000,完全偏离了题目的约束条件。
  • 没有利用a < b < c的规则缩小遍历范围,产生了巨量无效计算,还在每次循环都打印无意义的判断日志,严重拖慢运行速度。
  • 存在冗余代码:比如无意义的josephmama = 11赋值,以及在外层c固定的情况下,在内层循环重复计算c_sqr,做了很多无用功。
  • 多余判断:你写的if a + b + c == 1000判断完全没必要,只要三个变量是从和为1000的规则推导出来的,这个条件恒成立。
正确的实现思路

利用题目给出的两个约束直接减少循环层数,把时间复杂度压到最低:

  • 因为a < b < c,所以a必然小于1000/3≈333,否则三个数相加大于1000,a的遍历范围直接设为1到332即可。
  • 确定a之后,b必须大于a,同时满足b < c = 1000 -a -b,推导可得b < (1000 -a)/2,b的遍历范围设为a+1到(1000-a)//2即可。
  • c不需要单独遍历,直接通过c = 1000 -a -b计算,之后只需要验证毕达哥拉斯定理即可,找到符合条件的三元组直接计算乘积退出。
修正后可直接运行的代码
for a in range(1, 333):
    # 严格遵守a < b < c的范围限制
    for b in range(a + 1, (1000 - a) // 2 + 1):
        c = 1000 - a - b
        if a ** 2 + b ** 2 == c ** 2:
            print(f"{a*b*c} is the answer")
            exit()

运行后得到正确结果31875000,对应的三元组为200、375、425,验证可得:200+375+425=1000,200²+375²=40000+140625=180625=425²,完全符合题目要求。

性能对比
  • 原代码两层循环遍历次数接近100万次,加上每次循环的打印操作,运行效率极低。
  • 修正后的代码总遍历次数不到3万次,没有多余打印操作,运行瞬间即可出结果。

内容的提问来源于stack exchange,提问作者DawsUTV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:48:23