我需要为这个等式找到所有可能的解决方案:
x+2y = N
,x<100000
和y<100000
。
给出N=10
,比如说。
我在 python 中这样做:
for x in range(1,100000):
for y in range(1,100000):
if x + 2*y == 10:
print x, y
我应该如何针对速度进行优化?我该怎么办?
基本上这是语言不可知问题。 C / C ++ 答案也会有所帮助。
答案 0 :(得分:5)
如果x+2y = N
,则y = (N-x)/2
(假设N-x
为偶数)。您无需遍历range(1,100000)
if (N % 2): x0 = 1
else: x0 = 0
for x in range(x0, min(x,100000), 2):
print x, (N-x)/2
编辑:
你必须注意N-x不会变成负数。这就是min
应该做的事情
Leftris的答案实际上比我的好,因为这些特殊情况以优雅的方式得到照顾
答案 1 :(得分:3)
我们可以迭代y的域并计算x。同时考虑到x也具有有限的范围,我们进一步将y的域限制为[1,N / 2](因为y的任何超过N / 2将给出x的负值)
x=N;
for y in range(1,N/2-1):
x = x-2
print x, y
答案 2 :(得分:1)
这是以二次方式运行的。您可以通过将等式重新排列为y = ...
形式,将其缩短为线性时间。这允许您仅循环x
,计算y
,并检查它是否为整数。
答案 3 :(得分:0)
您可以尝试仅检查x
给定N =10
的偶数数字;
原因是:2y
必须是偶数,因此x
必须是偶数。这应该将总运行时间减少到检查所有x
的一半。
如果您还要求答案是自然数,则排除负数。然后,您只需要检查[0,10]
x
之间的数字,因为x
和2y
都必须不大于10
。< / p>
答案 4 :(得分:0)
按y
计算x
。对于整数为正x
和实数y
:
for x in range(1,N):
print (x, (N-x)/2)
答案 5 :(得分:0)
Lefteris E的答案是要走的路,
但我觉得y
应该在[1,N/2]
范围内,而不是[1,2*N]
说明:
x+2*y = N
//replace x with N-2*y
N-2*(y) + 2*y = N
N-2*(N/2) + 2*y = N
2*y = N
//therefore, when x=0, y is maximum, and y = N/2
y = N/2
现在你可以这样做:
for y in range(1,int(N/2)):
x = N - (y<<1)
print x, y