代码之家  ›  专栏  ›  技术社区  ›  paan

3个或更多数字的最小公倍数

  •  136
  • paan  · 技术社区  · 17 年前

    如何计算多个数的最小公倍数?

    到目前为止,我只能用两个数字来计算。但不知道如何扩展它来计算3个或更多的数字。

    到目前为止,我是这样做的

    LCM = num1 * num2 /  gcd ( num1 , num2 )
    

    gcd是计算数字最大公因数的函数。使用欧几里得算法

    但我不知道如何计算3个或更多的数字。

    30 回复  |  直到 7 年前
        1
  •  170
  •   A. Rex    17 年前

    您可以通过迭代计算两个以上数字的LCM,即

    lcm(a,b,c) = lcm(a,lcm(b,c))
    
        2
  •  142
  •   jfs    9 年前

    在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() 工作方式类似 that :

    >>> f = lambda a,b: "f(%s,%s)" % (a,b)
    >>> print reduce(f, "abcd")
    f(f(f(a,b),c),d)
    
        3
  •  22
  •   T3db0t    16 年前

    下面是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));
        }
    }
    
        4
  •  10
  •   Rodrigo López    11 年前

    我会选择这个(c):

    static long LCM(long[] numbers)
    {
        return numbers.Aggregate(lcm);
    }
    static long lcm(long a, long b)
    {
        return Math.Abs(a * b) / GCD(a, b);
    }
    static long GCD(long a, long b)
    {
        return b == 0 ? a : GCD(b, a % b);
    }
    

    只是一些澄清,因为乍一看,它并没有接缝,所以这段代码在做什么:

    Aggregate是一个Linq扩展方法,因此您不能忘记向引用中添加使用System.Linq的方法。

    Aggregate得到一个累积函数,因此我们可以在IEnumerable上使用属性lcm(a,b,c)=lcm(a,lcm(b,c))。 More on Aggregate

    GCD计算利用 Euclidean algorithm .

    LCM计算使用abs(a*b)/gcd(a,b),参见 Reduction by the greatest common divisor .

    希望这有帮助,

        5
  •  6
  •   Matt Ellen Bipin Vayalu    16 年前

    我刚在哈斯克尔发现了这个:

    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 功能,只在序曲中找到!今天我学到了很多东西:D

        6
  •  6
  •   Eratosthenes    14 年前

    一些不需要gcd函数的python代码:

    from sys import argv 
    
    def lcm(x,y):
        tmp=x
        while (tmp%y)!=0:
            tmp+=x
        return tmp
    
    def lcmm(*args):
        return reduce(lcm,args)
    
    args=map(int,argv[1:])
    print lcmm(*args)
    

    以下是航站楼的情况:

    $ python lcm.py 10 15 17
    510
    
        7
  •  5
  •   Asclepius    8 年前

    下面是一个python一行程序(不计算导入次数),用于返回从1到20(包括1到20)的整数LCM:

    python 3.5+导入:

    from functools import reduce
    from math import gcd
    

    python 2.7导入:

    from fractions import gcd
    

    共同逻辑:

    lcm = reduce(lambda x,y: x*y//gcd(x, y), range(1, 21))
    

    在两者 Python 2 Python 3 ,运算符优先规则规定 * // 运算符具有相同的优先级,因此它们从左到右都适用。像这样的, x*y//z 方法 (x*y)//z 而不是 x*(y//z) . 这两者通常产生不同的结果。这对浮点数除法没有那么重要,但对 floor division .

        8
  •  3
  •   t9mike    13 年前

    这是维吉尔·迪斯克尔的一个C港口,他哀求道:

    public class MathUtils
    {
        /// <summary>
        /// Calculates the least common multiple of 2+ numbers.
        /// </summary>
        /// <remarks>
        /// Uses recursion based on lcm(a,b,c) = lcm(a,lcm(b,c)).
        /// Ported from http://stackoverflow.com/a/2641293/420175.
        /// </remarks>
        public static Int64 LCM(IList<Int64> numbers)
        {
            if (numbers.Count < 2)
                throw new ArgumentException("you must pass two or more numbers");
            return LCM(numbers, 0);
        }
    
        public static Int64 LCM(params Int64[] numbers)
        {
            return LCM((IList<Int64>)numbers);
        }
    
        private static Int64 LCM(IList<Int64> numbers, int i)
        {
            // Recursively iterate through pairs of arguments
            // i.e. lcm(args[0], lcm(args[1], lcm(args[2], args[3])))
    
            if (i + 2 == numbers.Count)
            {
                return LCM(numbers[i], numbers[i+1]);
            }
            else
            {
                return LCM(numbers[i], LCM(numbers, i+1));
            }
        }
    
        public static Int64 LCM(Int64 a, Int64 b)
        {
            return (a * b / GCD(a, b));
        }
    
        /// <summary>
        /// Finds the greatest common denominator for 2 numbers.
        /// </summary>
        /// <remarks>
        /// Also from http://stackoverflow.com/a/2641293/420175.
        /// </remarks>
        public static Int64 GCD(Int64 a, Int64 b)
        {
            // Euclidean algorithm
            Int64 t;
            while (b != 0)
            {
                t = b;
                b = a % b;
                a = t;
            }
            return a;
        }
    }'
    
        9
  •  3
  •   Asclepius    9 年前

    函数查找任何数字列表的LCM:

     def function(l):
         s = 1
         for i in l:
            s = lcm(i, s)
         return s
    
        10
  •  2
  •   SepehrM    12 年前

    使用LINQ,您可以编写:

    static int LCM(int[] numbers)
    {
        return numbers.Aggregate(LCM);
    }
    
    static int LCM(int a, int b)
    {
        return a * b / GCD(a, b);
    }
    

    应该加 using System.Linq; 别忘了处理例外…

        11
  •  2
  •   cmilr    8 年前

    这里是 迅捷 .

    // Euclid's algorithm for finding the greatest common divisor
    func gcd(_ a: Int, _ b: Int) -> Int {
      let r = a % b
      if r != 0 {
        return gcd(b, r)
      } else {
        return b
      }
    }
    
    // Returns the least common multiple of two numbers.
    func lcm(_ m: Int, _ n: Int) -> Int {
      return m / gcd(m, n) * n
    }
    
    // Returns the least common multiple of multiple numbers.
    func lcmm(_ numbers: [Int]) -> Int {
      return numbers.reduce(1) { lcm($0, $1) }
    }
    
        12
  •  1
  •   Community Mohan Dere    14 年前

    你可以用另一种方法- 设N个数,取一对连续数,将其LCM保存在另一个数组中。在第一个迭代程序中这样做会进行n/2次迭代。然后,从0开始,像(0,1)、(2,3)等等。计算它们的LCM并存储在另一个数组中。执行此操作,直到只剩下一个数组。 (如果n是奇数,则不可能找到lcm)

        13
  •  1
  •   mpalanco    11 年前

    在R中,我们可以使用函数 MGCD (x)和 最小均方误差 (x)从包装中取出 数字 ,要同时计算整数向量x中所有数字的最大公因数和最小公倍数:

        library(numbers)
        mGCD(c(4, 8, 12, 16, 20))
    [1] 4
        mLCM(c(8,9,21))
    [1] 504
        # Sequences
        mLCM(1:20)
    [1] 232792560
    
        14
  •  1
  •   Saebekassebil    11 年前

    ES6风格

    function gcd(...numbers) {
      return numbers.reduce((a, b) => b === 0 ? a : gcd(b, a % b));
    }
    
    function lcm(...numbers) {
      return numbers.reduce((a, b) => Math.abs(a * b) / gcd(a, b));
    }
    
        15
  •  1
  •   Zach-M    9 年前

    scala版本:

    def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
    def gcd(nums: Iterable[Int]): Int = nums.reduce(gcd)
    def lcm(a: Int, b: Int): Int = if (a == 0 || b == 0) 0 else a * b / gcd(a, b)
    def lcm(nums: Iterable[Int]): Int = nums.reduce(lcm)
    
        16
  •  1
  •   sorontar    9 年前

    为了好玩,shell(几乎所有shell)实现:

    #!/bin/sh
    gcd() {   # Calculate $1 % $2 until $2 becomes zero.
          until [ "$2" -eq 0 ]; do set -- "$2" "$(($1%$2))"; done
          echo "$1"
          }
    
    lcm() {   echo "$(( $1 / $(gcd "$1" "$2") * $2 ))";   }
    
    while [ $# -gt 1 ]; do
        t="$(lcm "$1" "$2")"
        shift 2
        set -- "$t" "$@"
    done
    echo "$1"
    

    试试看:

    $ ./script 2 3 4 5 6
    

    得到

    60
    

    最大输入和结果应小于 (2^63)-1 否则外壳数学将被包装。

        17
  •  1
  •   mehmet riza oz    9 年前

    我在寻找数组元素的gcd和lcm,并在下面的链接中找到了一个很好的解决方案。

    https://www.hackerrank.com/challenges/between-two-sets/forum

    包括以下代码。GCD的算法使用欧几里得算法,在下面的链接中解释得很好。

    https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm

    private static int gcd(int a, int b) {
        while (b > 0) {
            int temp = b;
            b = a % b; // % is remainder
            a = temp;
        }
        return a;
    }
    
    private static int gcd(int[] input) {
        int result = input[0];
        for (int i = 1; i < input.length; i++) {
            result = gcd(result, input[i]);
        }
        return result;
    }
    
    private static int lcm(int a, int b) {
        return a * (b / gcd(a, b));
    }
    
    private static int lcm(int[] input) {
        int result = input[0];
        for (int i = 1; i < input.length; i++) {
            result = lcm(result, input[i]);
        }
        return result;
    }
    
        18
  •  1
  •   Avatar    8 年前

    这里是 PHP 实施:

        // https://stackoverflow.com/q/12412782/1066234
        function math_gcd($a,$b) 
        {
            $a = abs($a); 
            $b = abs($b);
            if($a < $b) 
            {
                list($b,$a) = array($a,$b); 
            }
            if($b == 0) 
            {
                return $a;      
            }
            $r = $a % $b;
            while($r > 0) 
            {
                $a = $b;
                $b = $r;
                $r = $a % $b;
            }
            return $b;
        }
    
        function math_lcm($a, $b)
        {
            return ($a * $b / math_gcd($a, $b));
        }
    
        // https://stackoverflow.com/a/2641293/1066234
        function math_lcmm($args)
        {
            // Recursively iterate through pairs of arguments
            // i.e. lcm(args[0], lcm(args[1], lcm(args[2], args[3])))
    
            if(count($args) == 2)
            {
                return math_lcm($args[0], $args[1]);
            }
            else 
            {
                $arg0 = $args[0];
                array_shift($args);
                return math_lcm($arg0, math_lcmm($args));
            }
        }
    
        // fraction bonus
        function math_fraction_simplify($num, $den) 
        {
            $g = math_gcd($num, $den);
            return array($num/$g, $den/$g);
        }
    
    
        var_dump( math_lcmm( array(4, 7) ) ); // 28
        var_dump( math_lcmm( array(5, 25) ) ); // 25
        var_dump( math_lcmm( array(3, 4, 12, 36) ) ); // 36
        var_dump( math_lcmm( array(3, 4, 7, 12, 36) ) ); // 252
    

    信用卡转到@t3db0t answer above (ECMA-style code) .

        19
  •  0
  •   Roger Garzon Nieto    13 年前

    GCD需要对负数进行一点更正:

    def gcd(x,y):
      while y:
        if y<0:
          x,y=-x,-y
        x,y=y,x % y
        return x
    
    def gcdl(*list):
      return reduce(gcd, *list)
    
    def lcm(x,y):
      return x*y / gcd(x,y)
    
    def lcml(*list):
      return reduce(lcm, *list)
    
        20
  •  0
  •   Alessandro Martin    13 年前

    这个怎么样?

    from operator import mul as MULTIPLY
    
    def factors(n):
        f = {} # a dict is necessary to create 'factor : exponent' pairs 
        divisor = 2
        while n > 1:
            while (divisor <= n):
                if n % divisor == 0:
                    n /= divisor
                    f[divisor] = f.get(divisor, 0) + 1
                else:
                    divisor += 1
        return f
    
    
    def mcm(numbers):
        #numbers is a list of numbers so not restricted to two items
        high_factors = {}
        for n in numbers:
            fn = factors(n)
            for (key, value) in fn.iteritems():
                if high_factors.get(key, 0) < value: # if fact not in dict or < val
                    high_factors[key] = value
        return reduce (MULTIPLY, ((k ** v) for k, v in high_factors.items()))
    
        21
  •  0
  •   Roman Pietrzak    11 年前

    我们有工作实施 of Least Common Multiple on Calculla 它适用于任何数量的输入,也显示步骤。

    我们所做的是:

    0: Assume we got inputs[] array, filled with integers. So, for example:
       inputsArray = [6, 15, 25, ...]
       lcm = 1
    
    1: Find minimal prime factor for each input.
       Minimal means for 6 it's 2, for 25 it's 5, for 34 it's 17
       minFactorsArray = []
    
    2: Find lowest from minFactors:
       minFactor = MIN(minFactorsArray)
    
    3: lcm *= minFactor
    
    4: Iterate minFactorsArray and if the factor for given input equals minFactor, then divide the input by it:
      for (inIdx in minFactorsArray)
        if minFactorsArray[inIdx] == minFactor
          inputsArray[inIdx] \= minFactor
    
    5: repeat steps 1-4 until there is nothing to factorize anymore. 
       So, until inputsArray contains only 1-s.
    

    就这样-你有你的LCM。

        22
  •  0
  •   User    11 年前

    LCM既具有关联性,又具有交换性。

    LCM(A,B,C)=LCM(LCM(A,B,C)=LCM(A,LCM(B,C))。

    下面是C中的示例代码:

    int main()
    {
      int a[20],i,n,result=1;  // assumption: count can't exceed 20
      printf("Enter number of numbers to calculate LCM(less than 20):");
      scanf("%d",&n);
      printf("Enter %d  numbers to calculate their LCM :",n);
      for(i=0;i<n;i++)
        scanf("%d",&a[i]);
     for(i=0;i<n;i++)
       result=lcm(result,a[i]);
     printf("LCM of given numbers = %d\n",result);
     return 0;
    }
    
    int lcm(int a,int b)
    {
      int gcd=gcd_two_numbers(a,b);
      return (a*b)/gcd;
    }
    
    int gcd_two_numbers(int a,int b)
    {
       int temp;
       if(a>b)
       {
         temp=a;
         a=b;
         b=temp;
       }
      if(b%a==0)
        return a;
      else
        return gcd_two_numbers(b%a,a);
    }
    
        23
  •  0
  •   Behnam Dezfouli    11 年前

    方法complcm接受一个向量并返回lcm。所有的数字都在矢量中。

    int mathOps::compLCM(std::vector<int> &in_numbers)
     {
        int tmpNumbers = in_numbers.size();
        int tmpMax = *max_element(in_numbers.begin(), in_numbers.end());
        bool tmpNotDividable = false;
    
        while (true)
        {
            for (int i = 0; i < tmpNumbers && tmpNotDividable == false; i++)
            {
                if (tmpMax % in_numbers[i] != 0 )
                    tmpNotDividable = true;
            }
    
            if (tmpNotDividable == false)
                return tmpMax;
            else
                tmpMax++;
        }
    }
    
        24
  •  0
  •   Alex Riley    11 年前
    clc;
    
    data = [1 2 3 4 5]
    
    LCM=1;
    
    for i=1:1:length(data)
    
        LCM = lcm(LCM,data(i))
    
    end 
    
        25
  •  0
  •   Nikhil    10 年前

    对于任何寻找快速工作代码的人,请尝试以下操作:

    我写了一个函数 lcm_n(args, num) 它计算并返回数组中所有数字的LCM args . 第二个参数 num 是数组中的数字计数。

    把这些数字放在一个数组中 阿尔茨海默病 然后像这样调用函数 lcm_n(args,num);

    这个函数 收益率 所有这些数字的LCM。

    下面是函数的实现 lcm_n(args,num) :

    int lcm_n(int args[], int num) //lcm of more than 2 numbers
    {
        int i, temp[num-1];
    
        if(num==2)
        {
            return lcm(args[0], args[1]);
        }
        else
        {
            for(i=0;i<num-1;i++)
            {
               temp[i] = args[i];   
            }
    
            temp[num-2] = lcm(args[num-2], args[num-1]);
            return lcm_n(temp,num-1);
        }
    }
    

    此函数需要以下两个函数才能工作。所以,只需将它们与它一起添加。

    int lcm(int a, int b) //lcm of 2 numbers
    {
        return (a*b)/gcd(a,b);
    }
    
    
    int gcd(int a, int b) //gcd of 2 numbers
    {
        int numerator, denominator, remainder;
    
        //Euclid's algorithm for computing GCD of two numbers
        if(a > b)
        {
            numerator = a;
            denominator = b;
        }
        else
        {
            numerator = b;
            denominator = a;
        }
        remainder = numerator % denominator;
    
        while(remainder != 0)
        {
            numerator   = denominator;
            denominator = remainder;
            remainder   = numerator % denominator;
        }
    
        return denominator;
    }
    
        26
  •  0
  •   vipul    9 年前

    int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a%b); } int lcm(int[] a, int n) { int res = 1, i; for (i = 0; i < n; i++) { res = res*a[i]/gcd(res, a[i]); } return res; }

        27
  •  0
  •   amirt    9 年前

    在蟒蛇中:

    def lcm(*args):
        """Calculates lcm of args"""
        biggest = max(args) #find the largest of numbers
        rest = [n for n in args if n != biggest] #the list of the numbers without the largest
        factor = 1 #to multiply with the biggest as long as the result is not divisble by all of the numbers in the rest
        while True:
            #check if biggest is divisble by all in the rest:
            ans = False in [(biggest * factor) % n == 0 for n in rest]
            #if so the clm is found break the loop and return it, otherwise increment factor by 1 and try again
            if not ans:
                break
            factor += 1
        biggest *= factor
        return "lcm of {0} is {1}".format(args, biggest)
    

    >>> lcm(100,23,98)
    'lcm of (100, 23, 98) is 112700'
    >>> lcm(*range(1, 20))
    'lcm of (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19) is 232792560'
    
        28
  •  0
  •   FelixSFD Tushar Panjwani    9 年前

    这是我用过的--

    def greater(n):
    
          a=num[0]
    
          for i in range(0,len(n),1):
           if(a<n[i]):
            a=n[i]
          return a
    
    r=input('enter limit')
    
    num=[]
    
    for x in range (0,r,1):
    
        a=input('enter number ')
        num.append(a)
    a= greater(num)
    
    i=0
    
    while True:
    
        while (a%num[i]==0):
            i=i+1
            if(i==len(num)):
                   break
        if i==len(num):
            print 'L.C.M = ',a
            break
        else:
            a=a+1
            i=0
    
        29
  •  0
  •   Rodrigo López    7 年前

    对于Python 3:

    from functools import reduce
    
    gcd = lambda a,b: a if b==0 else gcd(b, a%b)
    def lcm(lst):        
        return reduce(lambda x,y: x*y//gcd(x, y), lst)  
    
        30
  •  -1
  •   Sri    8 年前

    如果没有时间限制,这是相当简单和直接的:

    def lcm(a,b,c):
        for i in range(max(a,b,c), (a*b*c)+1, max(a,b,c)):
            if i%a == 0 and i%b == 0 and i%c == 0:
                return i