求一个线性方程的解集?

时间:2013-04-08 14:34:45

标签: c++ python c algorithm math

我需要为这个等式找到所有可能的解决方案:

x+2y = Nx<100000y<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 ++ 答案也会有所帮助。

6 个答案:

答案 0 :(得分:5)

如果x+2y = N,则y = (N-x)/2(假设N-x为偶数)。您无需遍历range(1,100000)

像这样(对于给定的N)

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
  • 这只是循环N / 2次(而不是50000)
  • 它甚至没有做那些昂贵的乘法和除法

答案 2 :(得分:1)

这是以二次方式运行的。您可以通过将等式重新排列为y = ...形式,将其缩短为线性时间。这允许您仅循环x,计算y,并检查它是否为整数。

答案 3 :(得分:0)

您可以尝试仅检查x给定N =10的偶数数字; 原因是:2y必须是偶数,因此x必须是偶数。这应该将总运行时间减少到检查所有x的一半。

如果您还要求答案是自然数,则排除负数。然后,您只需要检查[0,10] x之间的数字,因为x2y都必须不大于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