0

假设ab分别以 2s 和 3s 的恒定速率记录:

>>> a
0, 2, 4, 6, 8, 10, 12
>>> b
0, 3, 6, 9, 12

我想在 python 中编写一个返回的函数

  1. 的最小正差(即大于零)a-b,和
  2. b达到相同值所需的实例数a

所以在前面的例子中,

  1. 的最小差a-b为1,即当a==4b==3(或a==10b==9
  2. 需要 3 个实例b才能达到a(ie, 0, 3, 6) 的相同值。

理想情况下,我想以这种方式使用该功能:

a = 2
b = 3
>>> my_fun(a,b)
>>> [1, 3] #1-smallest difference, 3-number of instances
4

2 回答 2

2

使用此答案lcm()中的功能:

def my_fun(a, b):
    n = lcm(a, b)
    arange = range(0, n+1, n // a if n > a else a)
    brange = range(0, n+1, n // b if n > b else b)
    m = min(x - y for x in arange for y in brange if x > y)
    return [m, n//b + 1]

这是假设您的值是整数ab如果您需要为浮点数执行此操作,只需乘以 10 的某个幂即可使它们成为整数。例如,使用a=2.34andb=3.73你将乘以 100,运行my_fun(234, 373),然后将结果的第一个值除以 100(第二个值可以按原样使用)。

这里是它所依赖的lcm()函数和函数:gcd()

def gcd(a, b):
    """Return greatest common divisor using Euclid's Algorithm."""
    while b:      
        a, b = b, a % b
    return a

def lcm(a, b):
    """Return lowest common multiple."""
    return a * b // gcd(a, b)
于 2013-09-12T18:25:59.827 回答
2
def worker(a, b):
    i, j, k = a, b, a
    while a != b:
        if a < b:
            a += i
        else:
            n = a - b
            k = n if not k else min(k, n)
            b += j

    return k, b / j + 1

>>> worker(4, 4)
(4, 2)
>>> worker(2, 3)
(1, 3)
于 2013-09-12T18:28:42.177 回答