170 votes

Le plus petit commun multiple pour 3 nombres ou plus

Comment calculer le plus petit commun multiple de plusieurs nombres ?

Jusqu'à présent, je n'ai été capable de le calculer qu'entre deux nombres. Mais je n'ai aucune idée de comment l'étendre pour calculer 3 nombres ou plus.

Voici comment j'ai procédé jusqu'à présent

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

Avec gcd est la fonction qui permet de calculer le plus grand diviseur commun pour les nombres. Utilisation de l'algorithme euclidien

Mais je n'arrive pas à trouver comment le calculer pour 3 nombres ou plus.

85 votes

S'il te plaît, ne considère pas ça comme un devoir. J'essaie de trouver un moyen de placer plusieurs pièces de métal sur une plaque et je dois trouver un moyen de placer des métaux de différentes longueurs sur la même plaque. LCM et GCD est la meilleure façon de le faire. Je suis un programmeur, pas un mathématicien. C'est pourquoi j'ai demandé.

2 votes

Emboîter de petites feuilles dans une feuille plus grande - emballage de bacs en 2D ?

3 votes

@HighPerformanceMark Tetris ?

196voto

A. Rex Points 17899

Vous pouvez calculer la LCM de plus de deux nombres en calculant itérativement la LCM de deux nombres, soit

lcm(a,b,c) = lcm(a,lcm(b,c))

12 votes

Récursion du manuel scolaire Ooooh :)

10 votes

Une définition d'algorithme récursif ne signifie pas nécessairement une sous-routine récursive. Vous pouvez implémenter cela dans une boucle assez simplement. Merci pour cette réponse parfaite.

150voto

J.F. Sebastian Points 102961

En Python (modifié 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)

Utilisation :

>>> lcmm(100, 23, 98)
112700
>>> lcmm(*range(1, 20))
232792560

reduce() fonctionne comme suit que :

>>> f = lambda a,b: "f(%s,%s)" % (a,b)
>>> print reduce(f, "abcd")
f(f(f(a,b),c),d)

1 votes

Je ne suis pas familier avec python, que fait reduce() ?

19 votes

Étant donné une fonction f et une liste l = [a,b,c,d], reduce(f,l) renvoie f(f(f(a,b),c),d). C'est l'implémentation fonctionnelle de "lcm peut être calculé en calculant itérativement le lcm de la valeur courante et de l'élément suivant de la liste".

4 votes

+1 pour montrer une solution qui peut s'adapter à plus de trois paramètres

27voto

Virgil Disgr4ce Points 487

Voici une mise en œuvre de type ECMA :

function gcd(a, b){
    // Euclidean algorithm
    while (b != 0){
        var temp = b;
        b = a % b;
        a = temp;
    }
    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));
    }
}

2 votes

C'est dommage que je ne comprenne pas ce que vous entendez par "style ECMA" =/

6voto

Matt Ellen Points 5270

Je viens de comprendre ça en 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

J'ai même pris le temps d'écrire mon propre gcd pour la trouver dans Prelude ! Beaucoup d'apprentissage pour moi aujourd'hui :D

1 votes

Vous pouvez utiliser foldr1 pour la dernière ligne : lcm ns = foldr1 lcm' ns ou lcm = foldr1 lcm'

0 votes

Vous pouvez également vous passer des signatures de type, pour un résultat vraiment minimal, comme suit Integral est impliquée par div

6voto

Eratosthenes Points 79

Un peu de code Python qui ne nécessite pas de fonction pour le pgcd :

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)

Voici à quoi cela ressemble dans le terminal :

$ python lcm.py 10 15 17
510

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X