Jak obliczyć najmniejszą wspólną wielokrotność wielu liczb?
Jak dotąd byłem w stanie obliczyć to tylko między dwiema liczbami. Ale nie mam pojęcia, jak go rozszerzyć, aby obliczyć 3 lub więcej liczb.
Jak dotąd tak to zrobiłem
LCM = num1 * num2 / gcd ( num1 , num2 )
Z gcd jest funkcją obliczającą największy wspólny dzielnik dla liczb. Wykorzystanie algorytmu euklidesowego
Ale nie mogę wymyślić, jak to obliczyć dla 3 lub więcej liczb.
Odpowiedzi:
Możesz obliczyć LCM więcej niż dwóch liczb, obliczając iteracyjnie LCM dwóch liczb, tj
źródło
W Pythonie (zmodyfikowany primes.py ):
Stosowanie:
reduce()
działa mniej więcej tak , że :źródło
t = a; a = b; b = t % b
Oto implementacja w stylu ECMA:
źródło
Poszedłbym z tym (C #):
Tylko kilka wyjaśnień, ponieważ na pierwszy rzut oka nie wydaje się tak jasne, co robi ten kod:
Aggregate to metoda rozszerzenia Linq, więc nie możesz zapomnieć o dodaniu do odwołań przy użyciu System.Linq.
Aggregate otrzymuje funkcję kumulującą, dzięki czemu możemy wykorzystać właściwość lcm (a, b, c) = lcm (a, lcm (b, c)) nad IEnumerable. Więcej o agregacie
Obliczenia GCD wykorzystują algorytm Euklidesa .
Obliczenie lcm wykorzystuje Abs (a * b) / gcd (a, b), patrz Redukcja przez największy wspólny dzielnik .
Mam nadzieję że to pomoże,
źródło
Właśnie to rozgryzłem w Haskell:
Poświęciłem nawet czas na napisanie własnej
gcd
funkcji, ale znalazłem ją w Preludium! Dużo się dzisiaj nauczyłem: Dźródło
lcm ns = foldr1 lcm' ns
lublcm = foldr1 lcm'
Integral
sugerujediv
Kod w Pythonie, który nie wymaga funkcji dla gcd:
Oto jak to wygląda w terminalu:
źródło
Oto jednowierszowy Python (nie licząc importu), aby zwrócić LCM liczb całkowitych od 1 do 20 włącznie:
Importy Pythona 3.5+:
Importy Pythona 2.7:
Wspólna logika:
Zauważ, że zarówno w Pythonie 2, jak i Pythonie 3 reguły pierwszeństwa operatorów narzucają, że operatory
*
i//
mają ten sam priorytet, więc są stosowane od lewej do prawej. Jako takie,x*y // z
oznacza,(x*y) // z
a niex * (y//z)
. Oba zwykle dają różne wyniki. Nie miałoby to większego znaczenia dla podziału typu float, ale ma znaczenie dla podziału podłogi .źródło
Oto port C # implementacji Virgila Disgr4ce:
źródło
Funkcja znajdowania lcm dowolnej listy liczb:
źródło
Używając LINQ możesz napisać:
Powinien dodać
using System.Linq;
i nie zapomnieć o obsłudze wyjątków ...źródło
I wersja Scala:
źródło
Tutaj jest w Swift .
źródło
możesz to zrobić w inny sposób - Niech będzie n liczb. Weź parę kolejnych liczb i zapisz jej lcm w innej tablicy. Robiąc to w pierwszej iteracji, program wykonuje n / 2 iteracji, a następnie wybiera parę zaczynającą się od 0, jak (0,1), (2,3) itd. Oblicz ich LCM i zapisz w innej tablicy. Rób to, dopóki nie zostanie ci jedna tablica. (nie można znaleźć lcm, jeśli n jest nieparzyste)
źródło
W R możemy użyć funkcji mGCD (x) i mLCM (x) z numerów pakietów , aby obliczyć największy wspólny dzielnik i najmniejszą wspólną wielokrotność dla wszystkich liczb w wektorze całkowitoliczbowym x razem:
źródło
Styl ES6
źródło
gcd(a, b)
alegdc
funkcja oczekuje tablicy, więc zamierzałeś ją wywołaćgcd([a, b])
Dla zabawy, implementacja powłoki (prawie każdej powłoki):
spróbuj z:
dostać
Największe dane wejściowe i wynik powinny być mniejsze niż
(2^63)-1
lub matematyka powłoki się zawinie.źródło
Szukałem gcd i lcm elementów tablicy i znalazłem dobre rozwiązanie w poniższym linku.
https://www.hackerrank.com/challenges/between-two-sets/forum
który zawiera następujący kod. Algorytm dla gcd wykorzystuje algorytm euklidesowy wyjaśniony dobrze w linku poniżej.
https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm
źródło
Oto implementacja PHP :
Kredyty trafiają do @ T3db0t z jego odpowiedzią powyżej (kod w stylu ECMA) .
źródło
GCD wymaga niewielkiej korekty liczb ujemnych:
źródło
Co powiesz na to?
źródło
Mamy działającą implementację Least Common Multiple w Calculla która działa dla dowolnej liczby wejść wyświetlających również kroki.
Co robimy to:
I to wszystko - masz swój lcm.
źródło
LCM jest zarówno asocjacyjna, jak i przemienna.
LCM (a, b, c) = LCM (LCM (a, b), c) = LCM (a, LCM (b, c))
oto przykładowy kod w C:
źródło
Metoda compLCM pobiera wektor i zwraca LCM. Wszystkie liczby znajdują się w obrębie wektora in_numbers.
źródło
źródło
Dla każdego, kto szuka szybko działającego kodu, spróbuj tego:
Napisałem funkcję,
lcm_n(args, num)
która oblicza i zwraca lcm wszystkich liczb w tablicyargs
. Drugi parametrnum
to liczba liczb w tablicy.Umieść wszystkie te liczby w tablicy,
args
a następnie wywołaj funkcję taką jaklcm_n(args,num);
Ta funkcja zwraca lcm wszystkich tych liczb.
Oto implementacja funkcji
lcm_n(args, num)
:Ta funkcja wymaga poniższych dwóch funkcji do działania. Więc po prostu dodaj je razem z nim.
źródło
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; }
źródło
W Pythonie:
źródło
To jest to, czego użyłem -
źródło
dla pythona 3:
źródło
W Rubim jest to tak proste, jak:
(testowane na Ruby 2.2.10 i 2.6.3.)
źródło