0

aとはb、それぞれ 2 秒と 3 秒の一定のレートで記録されます。

>>> 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. bの同じ値a(つまり) に到達するには、の 3 つのインスタンスが必要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]

これは、値が整数であるaと仮定してbいます。浮動小数点数に対してこれを行う必要がある場合は、10 の累乗を掛けて整数にします。したがって、たとえばa=2.34andb=3.73を使用すると、100 を掛けて実行しmy_fun(234, 373)、結果の最初の値を 100 で割ります (2 番目の値はそのまま使用できます)。

依存する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 に答える