python - 有没有办法优化找到 a+b+c=1000 的毕达哥拉斯三元组的算法?
问题描述
我正在尝试解决项目 euler 的第 9 个问题,这段代码可以完成这项工作,但是这样做需要很长时间(注意:我刚刚意识到 a<b<c 条件在函数中是无用的,因为它总是在循环)
from math import pow
def isPythagoeranTriplet(a,b,c):
return a < b < c and pow(a,2)+pow(b,2) == pow(c,2)
for c in range(5,1000) :
for b in range(4,c) :
for a in range(3,b) :
if isPythagoeranTriplet(a,b,c) and a+b+c == 1000:
print(a*b*c)
解决方案
一个简单的优化是避免做不必要的操作。
首先,当你知道一个有效的解决方案应该满足条件时,为什么要测试 all a
inrange(3,b)
a+b+c ==1000
第一个优化是:
from math import pow
def isPythagoeranTriplet(a,b,c):
return a < b < c and pow(a,2)+pow(b,2) == pow(c,2)
for c in range(5,1000) :
for b in range(4,c) :
a = 1000 - b - c
if a >= 0:
if isPythagoeranTriplet(a,b,c):
print(a*b*c)
您还可以更改您的功能,以便假设检查更容易,a<b<c
并且仅检查已经满足此条件的数字:
from math import pow
def isPythagoeranTriplet(a,b,c):
return pow(a,2)+pow(b,2) == pow(c,2)
for c in range(5,1000) :
for b in range(4,c) :
a = 1000 - b - c
if a >= 0 and a < b:
if isPythagoeranTriplet(a,b,c):
print(a*b*c)
通过构建,您拥有b<c
. 您还可以对其进行优化以测试少量的 b 和 c 值。如您所见,如果c=6, b=5
,您的值不能a
小于两个值并满足条件a+b+c = 1000
。您实际上可以进行的大多数优化都在循环范围内,以丢弃不需要测试的值。
推荐阅读
- python - 如何有条件地选择要显示的行
- c++ - 整数下溢导致模数失败
- python - Pygame 与面具的碰撞
- spring-boot - springboot中预期json输出时的圆形视图路径[错误]
- angularjs - 从 ajax jquery 迁移到 angularjs $http
- javascript - 单击按钮时将组件添加到另一个组件
- f# - F# Async.Parallel |> Async.RunSynchronously 只使用八个 CPU 核心之一?
- python - 如何将词干应用到字典中?
- r - R:在情节图例中使用表达式
- apache - Silverstripe 3.4 - 前端工作正常,但从 /admin 和 /admin/pages 中删除了前导斜杠