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
相关产品推荐
相关产品推荐

