我只是想知道是否有人知道更快/更有效的测试方法。
(假设写出方程的每一个解)
for z in range(500):
for x in range(500):
for y in range(500):
if (x * 80) + (z * 65) + (y * 50) == 1950:
print("x " + str(x) + " z " + str(z) + " y " + str(y))
谢谢!
最佳答案
我们假设 x,y,z
必须是正整数。否则有无穷无尽的解决方案。
从 x 和 z 计算 y
这是一个应该比你的方法快 500 倍的方法,仅仅是因为它不会迭代 y :
for z in range(500):
for x in range(500):
fifty_y = 1950 - (x * 80) - (z * 65)
if fifty_y >= 0 and (fifty_y % 50) == 0:
y = fifty_y // 50
print("x " + str(x) + " z " + str(z) + " y " + str(y))
通过遍历 x
, y
和 z
,你基本上是在黑暗中射击并希望它落在 1950
上.
但你知道 50 * y = 1950 - x * 80 - z * 65
, 所以你可以计算出 y
直接来自 x
和 z
.
50 * y
应该是积极的,如果y
是一个整数,应该能被50整除。
限制 x 和 z
range(500)
对于 x
来说太大了和 z
如果我们想要 y
积极。
range(1950 // 65 + 1)
应该足够 z
.
知道z
, range((1950 - 65 * z)// 80 + 1)
x
足够了.
作为奖励,我们确信 50 * y
是肯定的,我们可以删除一个测试:
for z in range(1950 // 65 + 1):
for x in range((1950 - 65 * z) // 80 + 1):
fifty_y = 1950 - (x * 80) - (z * 65)
if (fifty_y % 50) == 0:
y = fifty_y // 50
print("x " + str(x) + " z " + str(z) + " y " + str(y))
使用 Wolfram Alpha
通过在 wolfram alpha 中输入方程式,我们得到:
Integer solution: y = 13 n + x, z = -10 n - 2 x + 30, n element Z
太棒了!对于任何 x
,我们只需要选择n
这样两个y
和 z
是积极的。不需要 if
了。此代码迭代 42 次以显示 42 个解决方案:
for x in range(1950 // 80 + 1):
for n in range(- (x // 13), (30 - 2 * x) // 10 + 1):
z = -10 * n - 2 * x + 30
y = 13 * n + x
print("x " + str(x) + " z " + str(z) + " y " + str(y))
它几乎适合一行:
print [(x, 13 * n + x, 30 - 10 * n - 2 * x) for x in range(25) for n in range(-(x // 13), (30 - 2 * x) // 10 + 1)]
此代码也比您的原始代码快 300 万倍:)
关于Python - 更快的循环方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42728622/