НОД более чем 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). Но проблема в том, что в полевых условиях количество чисел переменно. |
Цитата:
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' )); Второй вариант, по идее, должен работать быстрее. |
Или так:
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' )); |
monolithed,
В Вашем варианте, если последнее число 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: все-равно мое решение некрасивое получилось) |
Часовой пояс GMT +3, время: 01:38. |