Найти наименьшее общее кратное в массиве - страница 2

 
Evgeniy Chumakov:


Считаю на сайте выдаёт следущий результат


На сайте - ты пишешь целые значения, а не дробные. Типа long.

Вон, выше я написал функцию для двух значений. Если значений много - надо найти НОК первых двух, потом НОК полученного значения и третьего элемента, потом - НОК полученного значения и четвертого элемента, и так далее.

 
Evgeniy Chumakov:


Нужно найти НОК , а не НОД

Ты весь код поглядел ?  Функция НОК - использует НОД.

Тебе нужна функция _LeastCommonMultiple(). Она использует функцию _GreaterCommonDivisor()
 

Georgiy Merts:


Если значений много - надо найти НОК первых двух, потом НОК полученного значения и третьего элемента, потом - НОК полученного значения и четвертого элемента, и так далее.


Так и делаю. Числа использую целые.

 
Georgiy Merts:


Тебе нужна функция _LeastCommonMultiple(). Она использует функцию _GreaterCommonDivisor()


Мне нужно для mql4 . Чтобы на входе был массив с числами, а на выходе НОК.

 
Evgeniy Chumakov:


Так и делаю. Числа использую целые.

Ну так в чем проблема ? Все украдено придумано до нас.

 
Evgeniy Chumakov:


Мне нужно для mql4 . Чтобы на входе был массив с числами, а на выходе НОК.

Я тебе дал код на MQL. Для двух значений. Тебе осталось подставить все числа массива.

 
Georgiy Merts:

Ну, друзья даете...

Простейшая же функция !

Функция _GreaterCommonDivisor (cо служебными) :

Да, пожалуй, это самый оптимальный вариант.

 
Evgeniy Chumakov:

Мне нужно для mql4 . Чтобы на входе был массив с числами, а на выходе НОК.

ulong LCM(ulong &x[])
  {
   ulong f=x[0];
   for(int j=1; j<ArraySize(x);j++)  f=_LeastCommonMultiple(f,x[j]);
   return f;
  }
2019.06.15 00:19:22.206 LCM (.BrentCrud,M1)     Наименьшее общее кратное массива из 1000 элементов = 3710369067405, Нахождение НОК из 1000 элементов выполнено за 118 микросекунд
2019.06.15 00:19:22.206 LCM (.BrentCrud,M1)     Наименьшее общее кратное 100000,100000,12500,50000,27051,24893,26673 = 598702640781300000

код скрипта кроссплатформенный

Файлы:
LCM.mq5  7 kb
LCM.mq4  7 kb
 

Кстати, рекомендую в данной функции работать именно с беззнаковыми значениями - это позволит избежать потенциальных ошибок.

Вобще, на мой взгляд, везде, где не предполагается отрицательных величин - в обязательном порядке надо использовать именно беззнаковые. А там, где в функцию требуется передать знаковое - делать прямое преобразование (предварительно проверив, что пришедшее беззнаковое значение не превышает допустимого, да и внутри любой функции необходимо всегда делать ASSERT'ы на допустимость пришедших значений).

 
Nikolai Semko:

код скрипта кроссплатформенный


Спасибо! Быстро работает. 


У меня код считал секунды 3 - 5.