我想得到一个数字'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')
答案 0 :(得分: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
答案 1 :(得分:0)
要生成给定总和的勾股三联体,可以运行两个循环,其中第一个循环从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)
答案 2 :(得分:0)
我使用了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]))