Python 给定和的勾股三重态
如果毕达哥拉斯三元组等于输入,下面的代码将打印它,但问题是,像90000这样的大数字需要很长时间才能回答。 如何优化以下代码? 1.≤ N≤ 9万Python 给定和的勾股三重态,python,pythagorean,triplet,Python,Pythagorean,Triplet,如果毕达哥拉斯三元组等于输入,下面的代码将打印它,但问题是,像90000这样的大数字需要很长时间才能回答。 如何优化以下代码? 1.≤ N≤ 9万 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,
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)
您的应用程序会使用蛮力搜索解决方案,因此速度很慢
更快的代码
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
操作代码
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
修改了操作代码,使其返回所有解决方案,而不是打印第一个发现的用于比较性能的解决方案
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\u pythagorean\u triplets
是一种O(n)算法,其工作原理如下
a^2 + b^2 = c^2 (triplet)
a + b + c = n (sum equals input)
denom=2*(n-a)
num=2*a**2+n**2-2*n*a
如果denom>0且num%denom==0:
c=num//denom
b=n-a-c
如果b>a:
(a,b,c)#是一个解决方案
如果我运行此代码并输入
90000
,它会立即打印不可能的
,然后退出。您从此页面复制/粘贴了代码:--它有很好的解释,您为什么不阅读它?检查代码是否已修改上述代码工作正常,但在输入较大的数字(例如90000)时工作缓慢。如何更改此代码以使其更快?非常感谢。这真的很有帮助