我只是想知道是否有人知道更快/更有效的方法来测试它。
(假设将每个解决方案都写出来)
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))
谢谢!
答案 0 :(得分:9)
我们假设x,y,z
必须是正整数。否则就会有无穷无尽的解决方案。
这是一种比你的方法快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整除。
range(500)
为正数,则{p> 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中键入等式,我们得到:
整数解: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万倍:)
答案 1 :(得分:2)
这将使您成为包含生成1950的x,y,z值的列表生成器。生成器构造的优点是在调用时生成值,而不是创建对象。
the_vals = ([x,y,z] for x in range(500) for y in range(500) for z in range(500) if (x * 80) + (z * 65) + (y * 50) == 1950)
然后打印出来就可以了
for x,y,z in the_vals:
print("x " + str(x) + " z " + str(z) + " y " + str(y))