Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.01.2013, 00:39
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

НОД более чем 2-х чисел
Помогите с функцией для получения НОД более чем 2-х чисел.

Для 2-х чисел функций полно. Например, для отыскания НОД 3-х чисел (a,b,c), использую эту функцию

function NOD(x,y){ while ((x!=0) && (y!=0)) {if (x>y) {x%=y} else {y%=x}} return (x+y) }
рекурсивно NOD(NOD(a,b),c). Но проблема в том, что в полевых условиях количество чисел переменно.
Ответить с цитированием
  #2 (permalink)  
Старый 06.01.2013, 01:33
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Сообщение от Demath
рекурсивно NOD(NOD(a,b),c)
Это хвостовая рекурсия, ее легко упразднить.
function NOD ( /* arguments */ ) {
  return Array.prototype.reduce.call( arguments, function ( x, y ) {
    while ( x && y ) {
      x > y ? x %= y : y %= x;
    }
    return x + y;
  });
}

alert([
  NOD( 10, 15 ),
  NOD( 111, 555, 407 ),
  NOD( 100, 200, 300, 400, 2225, 175, 19873625 ),
  NOD( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 )
].join( '\n' ));


Или более обратно совместимо
function NOD ( /* arguments */ ) {
  for ( var x = arguments[ 0 ], i = 1; i < arguments.length; i++ ) {
    var y = arguments[ i ];
    while ( x && y ) {
      x > y ? x %= y : y %= x;
    }
    x += y;
  }
  return x;
}

alert([
  NOD( 10, 15 ),
  NOD( 111, 555, 407 ),
  NOD( 100, 200, 300, 400, 2225, 175, 19873625 ),
  NOD( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 )
].join( '\n' ));

Второй вариант, по идее, должен работать быстрее.
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 06.01.2013 в 01:55.
Ответить с цитированием
  #3 (permalink)  
Старый 06.01.2013, 03:01
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Или так:

function NOD ( /* arguments */ ) {
  return Array.prototype.reduce.call( arguments, function ( x, y ) {
    while (1) {
		if (!(x %= y))
			return y;

        if (!(y %= x))
			return x;
    }
  });
}

alert([
  NOD( 10, 15 ),
  NOD( 111, 555, 407 ),
  NOD( 100, 200, 300, 400, 2225, 175, 19873625 ),
  NOD( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 )
].join( '\n' ));
Ответить с цитированием
  #4 (permalink)  
Старый 06.01.2013, 03:18
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

monolithed,

В Вашем варианте, если последнее число 0, то НОД=0, что не желательно.
А вообще, спасибо Вам и Дзен-трансгуманист!

Последний раз редактировалось Demath, 06.01.2013 в 04:20.
Ответить с цитированием
  #5 (permalink)  
Старый 06.01.2013, 05:27
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от Demath
В Вашем варианте, если последнее число 0, то НОД=0, что не желательно.
Ага, забыл)

function NOD ( /* arguments */ ) {
	return Array.prototype.reduce.call( arguments, function ( x, y ) {
		while (true) {
			if (y === 0)
				return x;

			if (!(x %= y))
				return y;

			if (!(y %= x))
				return x;
		}
	});
}


PS: все-равно мое решение некрасивое получилось)

Последний раз редактировалось monolithed, 06.01.2013 в 05:38.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с отбором чисел из массива mindkilla Общие вопросы Javascript 10 05.11.2012 12:03
Сложение дробных чисел demoniqus Общие вопросы Javascript 2 10.01.2012 21:15
Опять про округление чисел Kefir Общие вопросы Javascript 3 10.01.2012 15:34
Генератор случайных чисел с возможностью ввода диапазона. Как сделать? Sovereign Общие вопросы Javascript 3 10.06.2011 08:34
Работа с последовательностью натуральных чисел Stillife Общие вопросы Javascript 1 18.05.2011 20:03