我正在研究欧拉计画的问题9,并且已经选择了一段时间。
此问题指出:
毕达哥拉斯三联体是一组三个自然数,a
a ^ 2 + b ^ 2 = c ^ 2
例如3 ^ 2 + 4 ^ 2 = 9 + 16 = 25 = 5 ^ 2。存在一个毕达哥拉斯三联体,其中a + b + c =1000。
找到产品abc。'
我已经开发了一种代码,适用于3,4和5的毕达哥拉斯三元组的情况。但是,当扩展尝试查找整数a,b和c时,它没有任何结果,这让我觉得我的方法必须缺少几个勾股三元组。这是我的代码:
def square(list): #makes a function to square values in a list
return [i**2 for i in list]
list = range(1,333)
list2 = square(list)
i = len(list2) -1
while i != 1:
j=0
k=i
while j != k:
lhs = list2[j] + list2[k]
rhs = list2[i]
if lhs == rhs:
#print i+1,j+1,k+1 - included to check the code was working for small values
if i+1 + j+1 + k+1 == 1000:
print (i+1)*(j+1)*(k+1)
break
if lhs < rhs:
j += 1
if lhs > rhs:
k -= 1
i -= 1
如果您认为是这种情况,请告诉我,是否可以以某种方式改进代码或如何找到缺少的三元组!
答案 0 :(得分:1)
更优化的解决方案:
for a in range(1, 1000 / 3 + 1):
for b in range(a + 1, 1000 / 2 + 1):
c = 1000 - a - b
if a * a + b * b == c * c:
print a * b * c
范围说明:
a < b < c < 1000
,因此a
不得大于1000/3 b < c < 1000
,因此b
不得大于1000/2 c
是1000 - a - b
答案 1 :(得分:0)
如果您对效率不是特别感兴趣,可以这样做
import math
for a in range(1, 1000):
for b in range(1, 1000):
c = math.sqrt(a**2 + b**2)
if a + b + c == 1000:
print a * b * c