Wie berechnet man das kleinste gemeinsame Vielfache mehrerer Zahlen?
Bisher konnte ich es nur zwischen zwei Zahlen berechnen. Aber ich habe keine Ahnung, wie ich es erweitern soll, um 3 oder mehr Zahlen zu berechnen.
Bisher habe ich das so gemacht
LCM = num1 * num2 / gcd ( num1 , num2 )
Mit gcd ist die Funktion, den größten gemeinsamen Teiler für die Zahlen zu berechnen. Verwendung eines euklidischen Algorithmus
Aber ich kann nicht herausfinden, wie ich es für 3 oder mehr Zahlen berechnen soll.
Antworten:
Sie können den LCM von mehr als zwei Zahlen berechnen, indem Sie den LCM von zwei Zahlen iterativ berechnen, d. H.
quelle
In Python (modifizierte primes.py ):
Verwendung:
reduce()
funktioniert so etwas wie , dass :quelle
t = a; a = b; b = t % b
Hier ist eine Implementierung im ECMA-Stil:
quelle
Ich würde mit diesem gehen (C #):
Nur ein paar Klarstellungen, denn auf den ersten Blick ist nicht so klar, was dieser Code tut:
Aggregate ist eine Linq-Erweiterungsmethode, sodass Sie nicht vergessen können, System.Linq zu Ihren Referenzen hinzuzufügen.
Das Aggregat erhält eine Akkumulationsfunktion, sodass wir die Eigenschaft lcm (a, b, c) = lcm (a, lcm (b, c)) über eine IEnumerable verwenden können. Mehr zu Aggregat
Die GCD-Berechnung verwendet den euklidischen Algorithmus .
Die lcm-Berechnung verwendet Abs (a * b) / gcd (a, b), siehe Reduktion um den größten gemeinsamen Teiler .
Hoffe das hilft,
quelle
Ich habe das gerade in Haskell herausgefunden:
Ich habe mir sogar die Zeit genommen, meine eigene
gcd
Funktion zu schreiben , nur um sie im Prelude zu finden! Viel Lernen für mich heute: D.quelle
lcm ns = foldr1 lcm' ns
oderlcm = foldr1 lcm'
Integral
wird implizitdiv
Einige Python-Codes, für die keine Funktion für gcd erforderlich ist:
So sieht es im Terminal aus:
quelle
Hier ist ein Python-Einzeiler (ohne Importe), der den LCM der Ganzzahlen von 1 bis einschließlich 20 zurückgibt:
Python 3.5+ Importe:
Python 2.7-Importe:
Gemeinsame Logik:
Beachten Sie, dass sowohl in Python 2 und Python 3 , Betreiber Vorrangregeln diktieren , dass die
*
und//
Operatoren die gleiche Priorität haben, und so sie von links nach rechts an. Als solchesx*y // z
bedeutet(x*y) // z
und nichtx * (y//z)
. Die beiden führen normalerweise zu unterschiedlichen Ergebnissen. Dies wäre für die Float-Division nicht so wichtig gewesen, aber für die Floor-Division .quelle
Hier ist ein C # -Port der Implementierung von Virgil Disgr4ce:
quelle
Funktion zum Auffinden von lcm einer beliebigen Liste von Zahlen:
quelle
Mit LINQ können Sie schreiben:
Sollte hinzufügen
using System.Linq;
und nicht vergessen, die Ausnahmen zu behandeln ...quelle
Und die Scala-Version:
quelle
Hier ist es in Swift .
quelle
Sie können es auch anders machen - Lassen Sie es n Zahlen geben. Nehmen Sie ein Paar aufeinanderfolgender Zahlen und speichern Sie die lcm in einem anderen Array. Wenn Sie dies beim ersten Iterationsprogramm tun, werden n / 2 Iterationen ausgeführt. Nehmen Sie dann das nächste Paar ab 0 wie (0,1), (2,3) usw. auf. Berechnen Sie deren LCM und speichern Sie es in einem anderen Array. Tun Sie dies, bis Sie nur noch ein Array haben. (Es ist nicht möglich, lcm zu finden, wenn n ungerade ist.)
quelle
In R, können wir die Funktionen mGCD (x) und MLCM (x) aus den Paketnummern , die größten gemeinsamen Teiler und kleinste gemeinsame Vielfache für alle Zahlen in dem Integer - Vektor zusammen x zu berechnen:
quelle
ES6-Stil
quelle
gcd(a, b)
aber diegdc
Funktion erwartet ein Array, alsogcd([a, b])
Nur zum Spaß eine Shell-Implementierung (fast jede Shell):
versuchen Sie es mit:
bekommen
Die größte Eingabe und das größte Ergebnis sollten kleiner sein als
(2^63)-1
oder die Shell-Mathematik wird umbrochen.quelle
Ich suchte nach gcd und lcm von Array-Elementen und fand eine gute Lösung im folgenden Link.
https://www.hackerrank.com/challenges/between-two-sets/forum
welches folgenden Code enthält. Der Algorithmus für gcd verwendet den euklidischen Algorithmus, der im folgenden Link ausführlich erläutert wird.
https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm
quelle
Hier ist die PHP- Implementierung:
Credits gehen an @ T3db0t mit seiner Antwort oben (Code im ECMA-Stil) .
quelle
GCD benötigt eine kleine Korrektur für negative Zahlen:
quelle
Wie wäre es damit?
quelle
Wir haben eine funktionierende Implementierung von Least Common Multiple auf Calculla die für eine beliebige Anzahl von Eingaben funktioniert und auch die Schritte anzeigt.
Was wir tun ist:
Und das war's - du hast dein lcm.
quelle
LCM ist sowohl assoziativ als auch kommutativ.
LCM (a, b, c) = LCM (LCM (a, b), c) = LCM (a, LCM (b, c))
Hier ist der Beispielcode in C:
quelle
Die Methode compLCM nimmt einen Vektor und gibt LCM zurück. Alle Zahlen befinden sich innerhalb des Vektors in_numbers.
quelle
quelle
Wenn Sie nach schnell arbeitendem Code suchen, versuchen Sie Folgendes:
Ich habe eine Funktion geschrieben
lcm_n(args, num)
, die die lcm aller Zahlen im Array berechnet und zurückgibtargs
. Der zweite Parameternum
ist die Anzahl der Zahlen im Array.Fügen Sie alle diese Zahlen in ein Array ein
args
und rufen Sie dann die Funktion wie auflcm_n(args,num);
Diese Funktion gibt die lcm aller dieser Zahlen zurück.
Hier ist die Implementierung der Funktion
lcm_n(args, num)
:Diese Funktion benötigt weniger als zwei Funktionen, um zu funktionieren. Fügen Sie sie einfach hinzu.
quelle
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; }
quelle
In Python:
quelle
Das habe ich benutzt -
quelle
für Python 3:
quelle
In Ruby ist es so einfach wie:
(getestet auf Ruby 2.2.10 und 2.6.3.)
quelle