你显然在学习,所以如果你自己做所有事情会更好,但你现在从 akalenuk 那里得到了一个很好的解决方案,我希望你也能从中学到一些东西。
如果你同时学习 python,我会给你一个与 akalenuk 等效的解决方案,但这次使用列表理解,这是一个非常有用的机制:
N = 10000
print [(x, y, z)
for x in range(1, N+1)
for y in range(1, min( N/x, x) + 1 )
for z in [ (N - x*y) / (x+y) ]
if (N - x*y) % (x+y) == 0
if z <= y]
关键在于修剪解决方案空间。上面的代码已经很优化了。您可能会从以下内容开始:
N = 10000
print [(x, y, z)
for x in range(1, N+1)
for y in range(1, x+1 )
for z in range(y+1)
if N == x*y + y*z + x*z]
这将运行很长时间。因此,优化的第一点可能是在 y 上添加条件:
N = 10000
print [(x, y, z)
for x in range(1, N+1)
for y in range(1, x+1 )
if x*y <= N
for z in range(y+1)
if N == x*y + y*z + x*z]
这已经大大减少了时间,因为没有希望y
-loopz
根本不运行。然后,您注意到您实际上可以通过显式计算最大 y 来替换该 if 语句,就像 akalenuk 所做的那样:
N = 10000
print [(x, y, z)
for x in range(1, N+1)
for y in range(1, min(x, N/x) +1)
for z in range(y+1)
if N == x*y + y*z + x*z]
这将再次加快速度。
在您学习的过程中,我建议您尝试所有这些以及您自己的方法,计时并从中学习。我还建议尝试不同的、类似的解决方案