为什么此代码与查找公倍数无关?

时间:2019-02-03 14:29:38

标签: python algorithm

任务:

  

您正在编排各种动物的马戏表演。一次行动,您会在一条数字线上被赋予两只袋鼠,它们准备朝正方向(即朝正无穷大)跳跃。

     

第一个袋鼠从位置x1开始,以每次跳跃v1米的速度移动。   第二只袋鼠从位置x2开始,以每次跳跃v2米的速度移动。

     

作为节目的一部分,您必须想办法将两种袋鼠同时放在同一位置。如果可能,请返回YES,否则返回NO

如何替换给定代码中的while m < 1000行以扩展搜索范围。

我在Pycharm上执行了给定的代码。我发现没有执行。

x1 = 0
v1 = 3
mul1 = 0              # Multiple of Kangaroo 1
a = []             # Multiples of Kangaroo 1 List
x2 = 4
v2 = 2
mul2 = 0              # Multiple of Kangaroo 2
b = []             # Multiples of Kangaroo 2 List
m = 0
while m < 10000:                    # Limited search
    i = 0
    mul1 += x1 + (i*v1)
    a.append(mul1)
    mul2 += x2 + (i*v2)
    b.append(mul2)
    i += 1
    conj = list(set(a).intersection(b))             # List of common elements
    if len(conj) > 0:                        # Checking if conj has some values
        for x in range(len(conj)):
            print(conj[x])                # Prints common value
        break
    m += 1

我需要得到

YES

如果我输入

0
3
4
2

我需要得到

NO

如果我输入

0
2
5
3

2 个答案:

答案 0 :(得分:2)

您可以通过更简单的方法解决此问题。

假设小鸡以相同的速度跳跃(两者每分钟具有相同的跳跃次数,只是每个跳跃的距离都不同),您将获得以下内容(以数学计算):

x_final = x1 + v1 * num_jumps
x_final = x2 + v2 * num_jumps

进行一些重组(以数学术语表示),我们得到了这一点:

x1 + v1 * num_jumps = x2 + v2 * num_jumps
x1 - x2 = v2 * num_jumps - v1 * num_jumps
x1 - x2 = (v2 - v1) * num_jumps
(x1 - x2) / (v2 - v1) = num_jumps

现在有了值

x1 = 0
v1 = 3
x2 = 4
v2 = 2
(x1 - x2) / (v2 - v1) = num_jumps
(0 - 4) / (2 - 3) = num_jumps
(-4) / (-1) = num_jumps
4 = num_jumps

num_jumps是肯定的,所以他们会见面。

x1 = 0
v1 = 2
x2 = 5
v2 = 3
(x1 - x2) / (v2 - v1) = num_jumps
(0 - 5) / (3 - 2) = num_jumps
(-5) / 1 = num_jumps
-5 = num_jumps

这里num_jumps是负数,所以他们永远都不会见面。


一个Python函数来解决这个问题:

def will_they_meet(x1, v1, x2, v2):
    num_jumps = (x1 - x2) / (v2 - v1)
    return 'YES' if num_jumps >= 0 else 'NO'

注意:如果v1v2等于(ZeroDivisionError,或者传递给函数的参数不是数字,则此代码可能会引发错误。您可能需要添加try ... except块以使其更强大。

如您所见,不需要生成所有可能的位置,也不需要任何循环。

答案 1 :(得分:1)

解决这两个方程实际上要快得多(并且比迭代更简单),因为将来的解决方案可能任意远。这是在 O(1)时间和空间中运行的。

def solve(x1, v1, x2, v2):
    if v1 == v2:
        # If same start       -> always together (True)
        # If different start  -> will never meet (False)
        return x1 == x2
    else:
        t = (x2 - x1) / (v1 - v2)
        # Will only meet if the intersection happens in the future
        return t >= 0

def main():
    x1 = 0
    v1 = 3
    x2 = 4
    v2 = 2

    print('YES' if solve(x1, v1, x2, v2) else 'NO')


if __name__ == '__main__':
    main()