3个或者更多数字的最小公倍数
时间:2020-03-06 14:51:37 来源:igfitidea点击:
如何计算多个数字的最小公倍数?
到目前为止,我只能在两个数字之间进行计算。但是不知道如何扩展它来计算3个或者更多的数字。
到目前为止,这就是我的做法
LCM = num1 * num2 / gcd ( num1 , num2 )
使用gcd可以计算数字的最大公约数。使用欧几里得算法
但是我不知道如何计算3个或者更多数字。
解决方案
我们可以通过迭代计算两个数字的LCM来计算两个以上的LCM。
lcm(a,b,c) = lcm(a,lcm(b,c))
在Python中(修改了primes.py):
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) def lcmm(*args): """Return lcm of args.""" return reduce(lcm, args)
用法:
>>> lcmm(100, 23, 98) 112700 >>> lcmm(*range(1, 20)) 232792560
reduce()
的工作原理是这样的:
>>> f = lambda a,b: "f(%s,%s)" % (a,b) >>> print reduce(f, "abcd") f(f(f(a,b),c),d)
我只是在Haskell中弄清楚了这一点:
lcm' :: Integral a => a -> a -> a lcm' a b = a`div`(gcd a b) * b lcm :: Integral a => [a] -> a lcm (n:ns) = foldr lcm' n ns
我什至花时间编写了自己的gcd
函数,只是在Prelude中找到了它!今天对我来说是很多学习
这是ECMA样式的实现:
function gcd(a, b){ // Euclidean algorithm var t; while (b != 0){ t = b; b = a % b; a = t; } return a; } function lcm(a, b){ return (a * b / gcd(a, b)); } function lcmm(args){ // Recursively iterate through pairs of arguments // i.e. lcm(args[0], lcm(args[1], lcm(args[2], args[3]))) if(args.length == 2){ return lcm(args[0], args[1]); } else { var arg0 = args[0]; args.shift(); return lcm(arg0, lcmm(args)); } }