Найдите НОД в C++ без использования встроенной функции

Чтобы найти наибольший общий делитель (НОД) в C++ без использования встроенной функции, можно реализовать различные методы. Вот несколько подходов:

  1. Алгоритм Евклида:
    Алгоритм Евклида — это широко используемый метод поиска НОД двух чисел. Он основан на том свойстве, что НОД двух чисел остается неизменным, если большее число заменить его разницей с меньшим числом. Алгоритм может быть реализован рекурсивно или итеративно.

    Рекурсивная реализация:

    int gcd(int a, int b) {
       if (b == 0)
           return a;
       return gcd(b, a % b);
    }

    Итеративная реализация:

    int gcd(int a, int b) {
       while (b != 0) {
           int temp = b;
           b = a % b;
           a = temp;
       }
       return a;
    }
  2. Разложение простых чисел.
    Другой подход — найти разложение простых чисел на простые множители, а затем вычислить НОД путем умножения общих простых множителей.

    int gcd(int a, int b) {
       int gcd = 1;
       for (int i = 2; i <= a && i <= b; i++) {
           if (a % i == 0 && b % i == 0) {
               gcd *= i;
               a /= i;
               b /= i;
               i--;
           }
       }
       return gcd;
    }
  3. Двоичный алгоритм GCD (алгоритм Штейна):
    Этот алгоритм представляет собой оптимизированную версию алгоритма Евклида, который использует побитовые операции для уменьшения количества итераций.

    int gcd(int a, int b) {
       if (a == 0)
           return b;
       if (b == 0)
           return a;
       int k;
       for (k = 0; ((a | b) & 1) == 0; ++k) {
           a >>= 1;
           b >>= 1;
       }
       while ((a & 1) == 0)
           a >>= 1;
       do {
           while ((b & 1) == 0)
               b >>= 1;
           if (a > b)
               std::swap(a, b);
           b -= a;
       } while (b != 0);
       return a << k;
    }