在代码中找不到毕达哥拉斯三元组-代码或理论有问题吗?

时间:2018-08-08 16:21:27

标签: python-2.7

我正在研究欧拉计画的问题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

如果您认为是这种情况,请告诉我,是否可以以某种方式改进代码或如何找到缺少的三元组!

2 个答案:

答案 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
  • c1000 - 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