【问题标题】:Pythagorean Triplet with given sum给定总和的毕达哥拉斯三元组
【发布时间】:2020-05-12 15:00:47
【问题描述】:

如果它等于输入,则以下代码打印毕达哥拉斯三元组,但问题是像 90,000 这样的大数需要很长时间才能回答。 我可以做些什么来优化以下代码? 1 ≤ n ≤ 90 000

def pythagoreanTriplet(n):

    # Considering triplets in
    # sorted order. The value
    # of first element in sorted
    # triplet can be at-most n/3.
    for i in range(1, int(n / 3) + 1):

        # The value of second element
        # must be less than equal to n/2
        for j in range(i + 1,
                       int(n / 2) + 1):

            k = n - i - j
            if (i * i + j * j == k * k):
                print(i, ", ", j, ", ",
                      k, sep="")
                return

    print("Impossible")
# Driver Code
vorodi = int(input())
pythagoreanTriplet(vorodi)

【问题讨论】:

  • 如果我运行此代码并输入90000,它会立即打印Impossible 并退出。
  • 你从这个页面复制/粘贴了你的代码:geeksforgeeks.org/pythagorean-triplet-given-sum——它有很好的解释,你为什么不看一下??
  • 查看this
  • 代码已修改
  • 上述代码运行良好,但在输入较大的数字时运行缓慢,例如 90,000。如何更改此代码以使其更快?

标签: python pythagorean triplet


【解决方案1】:

您的 source code 会强力搜索解决方案,因此速度很慢。

更快的代码

def solve_pythagorean_triplets(n):
  " Solves for triplets whose sum equals n "
  solutions = []
  for a in range(1, n):
    denom = 2*(n-a)
    num = 2*a**2 + n**2 - 2*n*a
    if denom > 0 and num % denom == 0:
      c = num // denom
      b = n - a - c
      if b > a:
        solutions.append((a, b, c))

  return solutions

操作码

修改了 OP 代码,使其返回所有解决方案,而不是打印找到的第一个解决方案来比较性能

def pythagoreanTriplet(n): 

    # Considering triplets in  
    # sorted order. The value  
    # of first element in sorted  
    # triplet can be at-most n/3. 
    results = []
    for i in range(1, int(n / 3) + 1):  

        # The value of second element  
        # must be less than equal to n/2 
        for j in range(i + 1,  
                       int(n / 2) + 1):  

            k = n - i - j 
            if (i * i + j * j == k * k):
                results.append((i, j, k))

    return results

时机

 n     pythagoreanTriplet (OP Code)     solve_pythagorean_triplets (new)
  900   0.084 seconds                       0.039 seconds
  5000  3.130 seconds                       0.012 seconds
  90000 Timed out after several minutes     0.430 seconds

说明

函数 solve_pythagorean_triplets 是 O(n) 算法,其工作原理如下。

  1. 正在搜索:

    a^2 + b^2 = c^2 (triplet)
    a + b + c = n   (sum equals input)
    
  2. 通过搜索 a(即迭代的固定)来解决。有了一个固定的,我们有两个方程和两个未知数(b,c):

    b + c = n - a
    c^2 - b^2 = a^2
    
  3. 解决办法是:

    denom = 2*(n-a)
    num = 2*a**2 + n**2 - 2*n*a
    if denom > 0 and num % denom == 0:
        c = num // denom
        b = n - a - c
        if b > a:
            (a, b, c) # is a solution
    
  4. 迭代一个范围(1,n)以获得不同的解决方案

【讨论】:

  • 非常感谢。真的很有帮助?
【解决方案2】:

哟 我不知道您是否仍然需要答案,但希望这可以提供帮助。

n = int(input())
ans = [(a, b, c) for a in range(1, n) for b in range(a, n) for c in range(b, n) if (a**2 + b**2 == c**2 and a + b + c == n)]
if ans:
    print(ans[0][0], ans[0][1], ans[0][2])
else:
    print("Impossible")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多