【问题标题】:Pythagorean triple with python毕达哥拉斯三元组与 python
【发布时间】:2020-04-13 12:33:22
【问题描述】:

我想得到一个数字'n'并产生Pythagorean triple,它们的总数等于'n'。

例如,对于 n=12,我的输出是 3、4、5 (12 = 3 + 4 + 5)。

我写了下面的代码,但是大数字需要很多时间。请帮助我改进它。

a = int(input())
done = False
for i in range(int(a/4)+1,2,-1):
    if done:
        break
    for j in range(i+1,int(a/2)+1):
        k = a-(i+j)
        if k <= j:
            break
        if i**2 + j**2 == k**2:
            print(i,j,k)
            done = True
            break
if done == False:
    print('Impossible')

【问题讨论】:

    标签: python optimization pythagorean


    【解决方案1】:

    此代码可能对您有所帮助

    limits = int(input())
    c, m = 0, 2
    
    # Limiting c would limit  
    # all a, b and c 
    while c < limits : 
    
        # Now loop on n from 1 to m-1 
        for n in range(1, m) : 
            a = m * m - n * n 
            b = 2 * m * n 
            c = m * m + n * n 
    
            # if c is greater than 
            # limit then break it 
            if c > limits : 
                break
    
            if a+b+c == limits:
                print(a, b, c) 
    
        m = m + 1
    
    >> 12
    >> 3 4 5
    

    【讨论】:

    • 此代码对于某些数字是错误的,例如 10000=2000+ 3750+ 4250 但您的代码不打印任何内容
    • 让我再检查一遍
    • 这个答案只包含一个特定的状态而不是全部
    【解决方案2】:

    我已经使用joblib 模块来并行化您的代码,但我还没有测试过对于非常大的 n 是否存在加速;让我知道:

    from joblib import Parallel, delayed
    
    done = False
    
    def triple(a):
        global done 
        for i in range(int(a/4)+1,2,-1):
            if done:
                break
            for j in range(i+1,int(a/2)+1):
                k = a-(i+j)
                if k <= j:
                    break
                if i**2 + j**2 == k**2:
                    print(i,j,k)
                    done = True
                    break
    
        if done == False:
            print('Impossible')
    
    
    if __name__ == '__main__':
        a = int(input("n:"))
        Parallel(n_jobs=-1, backend="threading")(map(delayed(triple),  [a])) 
    

    【讨论】:

      【解决方案3】:

      要生成给定总和的毕达哥拉斯三元组,您可以运行两个循环,其中第一个循环从i = 1 to n/3 运行,第二个循环从j = i+1 to n/2 运行。在第二个循环中,我们检查(n – i – j) 是否等于i * i + j * j

      n = int(input()
      for i in range(1, int(n / 3) + 1): 
          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) 
      

      【讨论】:

      • 我只想要一个毕达哥拉斯三元组,根据上面的例子,它们的总和等于输入。
      • @MH 你检查了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 2016-01-08
      • 1970-01-01
      相关资源
      最近更新 更多