Как рассчитать наименьшее общее кратное нескольких чисел?
До сих пор я был в состоянии рассчитать его только между двумя числами. Но понятия не имею, как его расширить, чтобы вычислить 3 или более чисел.
Пока это как я это сделал
LCM = num1 * num2 / gcd ( num1 , num2 )
С gcd есть функция для вычисления наибольшего общего делителя для чисел. Использование евклидова алгоритма
Но я не могу понять, как рассчитать его для 3 или более чисел.
Ответы:
Вы можете вычислить LCM для более чем двух чисел путем итеративного вычисления LCM для двух чисел, т.е.
источник
В Python (модифицированный primes.py ):
Использование:
reduce()
работает что - то вроде , что :источник
t = a; a = b; b = t % b
Вот реализация в стиле ECMA:
источник
Я хотел бы пойти с этим (C #):
Просто некоторые пояснения, потому что на первый взгляд это не так ясно, что делает этот код:
Aggregate - это метод Linq Extension, поэтому вы не можете забыть добавить с помощью System.Linq к своим ссылкам.
Агрегат получает функцию накопления, поэтому мы можем использовать свойство lcm (a, b, c) = lcm (a, lcm (b, c)) над IEnumerable. Подробнее о совокупности
Расчет GCD использует евклидов алгоритм .
В расчете lcm используются Abs (a * b) / gcd (a, b), см. Уменьшение по наибольшему общему делителю .
Надеюсь это поможет,
источник
Я только что понял это в Haskell:
Я даже нашел время, чтобы написать свою собственную
gcd
функцию, только чтобы найти ее в Prelude! У меня сегодня много учений: Dисточник
lcm ns = foldr1 lcm' ns
илиlcm = foldr1 lcm'
Integral
это подразумеваетсяdiv
Некоторый код Python, который не требует функции для gcd:
Вот как это выглядит в терминале:
источник
Вот строка Python с одной строкой (не считая импорт) для возврата LCM целых чисел от 1 до 20 включительно:
Python 3.5+ импортирует:
Python 2.7 импортирует:
Общая логика:
Обратите внимание , что в обоих Python 2 и Python 3 , правила оператора предшествований диктуют , что
*
и//
операторы имеют одинаковый приоритет, и поэтому они применяются слева направо. Как такового,x*y // z
значит(x*y) // z
и нетx * (y//z)
. Оба обычно дают разные результаты. Это не имело бы такого большого значения для деления поплавков, но для деления на полу .источник
Вот порт C # реализации Virgil Disgr4ce:
источник
Функция для нахождения lcm любого списка номеров:
источник
Используя LINQ, вы можете написать:
Следует добавить
using System.Linq;
и не забывать обрабатывать исключения ...источник
И версия Scala:
источник
Вот оно в Свифте .
источник
Вы можете сделать это по-другому - Пусть будет n чисел. Возьмите пару последовательных чисел и сохраните их lcm в другом массиве. Делая это на первой итерации, программа делает n / 2 итерации. Затем берется следующая пара, начиная с 0, например (0,1), (2,3) и т. Д. Вычислите их LCM и сохраните в другом массиве. Делайте это, пока у вас не останется один массив. (невозможно найти lcm, если n нечетно)
источник
В R мы можем использовать функции mGCD (x) и mLCM (x) из номеров пакетов , чтобы вычислить наибольший общий делитель и наименьшее общее кратное для всех чисел в целочисленном векторе x вместе:
источник
Стиль ES6
источник
gcd(a, b)
ноgdc
функция ожидает массив, поэтому вы хотели вызватьgcd([a, b])
Просто для удовольствия, реализация оболочки (почти любой оболочки):
попробуйте это с:
получить
Наибольший вклад и результат должны быть меньше
(2^63)-1
или оболочка математики будет переноситься.источник
я искал 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
источник
Вот реализация PHP :
Кредиты идут на @ T3db0t с его ответом выше (код в стиле ECMA) .
источник
GCD нуждается в небольшой коррекции для отрицательных чисел:
источник
Как насчет этого?
источник
У нас есть рабочая реализация наименьшего общего кратного на калькул которая работает для любого количества входов, также отображая шаги.
Что мы делаем, это:
И это все - вы получили свой lcm.
источник
LCM является как ассоциативным, так и коммутативным.
LCM (а, б, в) = LCM (LCM (а, б), в) = LCM (а, LCM (б, в))
Вот пример кода на C:
источник
Метод compLCM берет вектор и возвращает LCM. Все числа находятся внутри вектора in_numbers.
источник
источник
Для тех, кто ищет быстрый рабочий код, попробуйте это:
Я написал функцию,
lcm_n(args, num)
которая вычисляет и возвращает lcm всех чисел в массивеargs
. Второй параметрnum
- это число чисел в массиве.Поместите все эти числа в массив,
args
а затем вызовите функцию какlcm_n(args,num);
Эта функция возвращает lcm всех этих чисел.
Вот реализация функции
lcm_n(args, num)
:Для этой функции необходимо две функции. Итак, просто добавьте их вместе с ним.
источник
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; }
источник
В питоне:
источник
Это то, что я использовал -
источник
для питона 3:
источник
В Ruby это так просто:
(протестировано на Ruby 2.2.10 и 2.6.3.)
источник