<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Наибольший общий делитель в JavaScript: алгоритмы и код]]></title><description><![CDATA[<p dir="auto">Наибольший общий делитель (НОД) - это базовая математическая операция, которая часто нужна в программировании. В JavaScript её реализуют для упрощения дробей, оптимизации алгоритмов или работы с числами. Мы разберём, как вычислить <strong>НОД</strong> для двух чисел и массива, используя простые методы.</p>
<p dir="auto">Это полезно для задач с факторизацией, генерацией последовательностей или обработки данных. Вы узнаете алгоритм Евклида, циклы и рекурсию, с готовыми примерами кода. Такие знания помогут избежать ошибок в проектах и ускорить вычисления.</p>
<h2>Что такое НОД и зачем он в JavaScript</h2>
<p dir="auto">НОД двух чисел - это наибольшее число, на которое оба делятся без остатка. Например, для 48 и 18 НОД равен 6, потому что 48 / 6 = 8 и 18 / 6 = 3. В JavaScript это решают алгоритмом Евклида: берём остаток от деления и повторяем, пока делитель не станет нулевым.</p>
<p dir="auto">Алгоритм работает быстро даже для больших чисел, O(log n) операций. Без него пришлось бы перебирать делители вручную, что медленно. В реальных задачах НОД используют для сокращения дробей в графике или расчёта НОК - наименьшего общего кратного.</p>
<p dir="auto">Вот базовые свойства НОД:</p>
<ul>
<li>НОД(a, b) = НОД(b, a)</li>
<li>НОД(a, 0) = |a|</li>
<li>НОД(a, b) = НОД(b, a % b)</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Свойство</th>
<th>Пример</th>
<th>Результат</th>
</tr>
</thead>
<tbody>
<tr>
<td>Коммутативность</td>
<td>НОД(12, 18)</td>
<td>6</td>
</tr>
<tr>
<td>Нулевой делитель</td>
<td>НОД(15, 0)</td>
<td>15</td>
</tr>
<tr>
<td>Рекурсия</td>
<td>НОД(48, 18) = НОД(18, 12)</td>
<td>6</td>
</tr>
</tbody>
</table>
<h2>Реализация НОД через цикл while</h2>
<p dir="auto">Метод с циклом - самый простой для понимания. Функция принимает два числа, берёт их абсолютные значения и в цикле заменяет делимое на делитель, а делитель на остаток. Цикл продолжается, пока второй аргумент не обнулится.</p>
<p dir="auto">Рассмотрим код: сначала сохраняем b в temp, потом b = a % b, a = temp. Это стандартная реализация Евклида. Для отрицательных чисел используем Math.abs(), чтобы НОД всегда был положительным. Тестируем на примерах: gcd(48, 18) вернёт 6, gcd(7, 13) - 1.</p>
<pre><code class="language-javascript">function gcd(a, b) {
  a = Math.abs(a);
  b = Math.abs(b);
  while (b !== 0) {
    let temp = b;
    b = a % b;
    a = temp;
  }
  return a;
}
</code></pre>
<ul>
<li><strong>Плюсы цикла</strong>: Не переполняет стек рекурсии, работает с большими числами.</li>
<li><em>Минус</em>: Чуть больше строк кода, чем в рекурсии.</li>
<li>Пример вызова: console.log(gcd(100, 25)); // 25</li>
</ul>
<h2>Рекурсивный подход к НОД</h2>
<p dir="auto">Рекурсия делает код короче: функция вызывает себя с новыми аргументами до базы случая. База - когда b равно 0, возвращаем a. Это элегантный вариант Евклида, популярный в учебниках.</p>
<p dir="auto">Для нескольких чисел редуцируем задачу: сначала НОД первых двух, потом с третьим и так далее. В ECMAScript 2022 есть встроенный BigInt.gcd, но для простоты напишем свой. Пример: gcd(9, 12) -&gt; gcd(12, 9 % 12=9) -&gt; gcd(9, 12 % 9=3) -&gt; gcd(3, 9 % 3=0) -&gt; 3.</p>
<pre><code class="language-javascript">function gcd(a, b) {
  a = Math.abs(a);
  b = Math.abs(b);
  if (b === 0) return a;
  return gcd(b, a % b);
}

// Для массива
function gcdArray(nums) {
  return nums.reduce((acc, num) =&gt; gcd(acc, num));
}
</code></pre>
<ul>
<li><strong>Преимущества</strong>: Код лаконичный, легко читать.</li>
<li><em>Ограничение</em>: Глубокая рекурсия может вызвать ошибку стека.</li>
<li>Тест: gcdArray([48, 18, 36]) // 6</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Код строк</th>
<th>Скорость</th>
<th>Подходит для</th>
</tr>
</thead>
<tbody>
<tr>
<td>Цикл</td>
<td>8</td>
<td>Быстро</td>
<td>Большие числа</td>
</tr>
<tr>
<td>Рекурсия</td>
<td>4</td>
<td>Быстро</td>
<td>Малые глубины</td>
</tr>
<tr>
<td>Встроенный</td>
<td>1</td>
<td>Оптимально</td>
<td>Современный JS</td>
</tr>
</tbody>
</table>
<h2>Расширение на диапазон и массив чисел</h2>
<p dir="auto">Иногда нужно найти НОД всех чисел в диапазоне [L, R], как в задачах с GitHub-проектами. Проходим циклом по диапазону и обновляем текущий НОД. Для массивов используем reduce - встроенный метод, который накапливает результат.</p>
<p dir="auto">Оптимизация: если НОД стал 1, дальше искать бессмысленно. В реальных проектах это ускоряет обработку больших массивов. Пример для [1,5]: НОД(1,2,3,4,5)=1. Для [10,20]: НОД=10.</p>
<pre><code class="language-javascript">function gcdRange(L, R) {
  let result = L;
  for (let i = L + 1; i &lt;= R; i++) {
    result = gcd(result, i);
    if (result === 1) break;
  }
  return result;
}
</code></pre>
<ul>
<li>Диапазон [4,8]: gcd=4</li>
<li><em>Нюанс</em>: Для L=1 всегда 1.</li>
<li>Массив: [24,36,48] -&gt; 12</li>
</ul>
<h2>Практические трюки с НОД в проектах</h2>
<p dir="auto">НОД упрощает дроби: 48/18 сократить до 8/3. В графике генерирует уникальные цвета через НОК. Для НОК используйте формулу: НОК(a,b) = (a * b) / gcd(a,b), но осторожно с переполнением.</p>
<p dir="auto">В MDN показывают, как добавить Math.gcd для вариативных аргументов. Это удобно для массивов без reduce. Тестируйте на edge-кейсах: нули, отрицательные, 1. Такие функции пишут в утилитах для повторного использования.</p>
<p dir="auto">Ключевые <strong>трюки</strong>:</p>
<ul>
<li>Всегда берите Math.abs() для отрицательных.</li>
<li><em>Избегайте</em> деления на ноль проверкой.</li>
<li>Для BigInt в Node.js используйте BigInt(a) % BigInt(b).</li>
</ul>
<h2>Вариации НОД для продвинутых задач</h2>
<p dir="auto">НОД работает не только с парами, но и с трёхмерными векторами в геймдеве или криптографии. Связан с алгоритмом Стерлинга для факториалов. В асинхронном коде оборачивайте в Web Workers для тяжёлых расчётов.</p>
<p dir="auto">Осталось место для оптимизаций вроде бинарного ГCD - быстрее на 20-30% за счёт сдвигов бит. Или комбинация с Math - для дробей в Canvas. Подумать стоит над интеграцией в React/Vue компоненты для интерактивных калькуляторов.</p>
]]></description><link>https://forum.exlends.ru/topic/855/naibolshij-obshij-delitel-v-javascript-algoritmy-i-kod</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:11:35 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/855.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 Feb 2026 14:26:37 GMT</pubDate><ttl>60</ttl></channel></rss>