假设a
和b
分别以2s和3s的恒定速率记录:
>>> a
0, 2, 4, 6, 8, 10, 12
>>> b
0, 3, 6, 9, 12
我想在python中编写一个返回
的函数a-b
和b
达到相同a
值的实例数。所以在上一个例子中,
a-b
的最小差异为1,即a==4
和b==3
(或a==10
和b==9
)b
的3个实例才能达到a
的相同值(即0, 3, 6
)。 理想情况下,我想以这种方式使用该功能:
a = 2
b = 3
>>> my_fun(a,b)
>>> [1, 3] #1-smallest difference, 3-number of instances
答案 0 :(得分:2)
使用this answer中的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.34
和b=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)
答案 1 :(得分: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)