Чтобы найти наибольший общий делитель (НОД) в C++ без использования встроенной функции, можно реализовать различные методы. Вот несколько подходов:
-
Алгоритм Евклида:
Алгоритм Евклида — это широко используемый метод поиска НОД двух чисел. Он основан на том свойстве, что НОД двух чисел остается неизменным, если большее число заменить его разницей с меньшим числом. Алгоритм может быть реализован рекурсивно или итеративно.Рекурсивная реализация:
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; } -
Разложение простых чисел.
Другой подход — найти разложение простых чисел на простые множители, а затем вычислить НОД путем умножения общих простых множителей.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; } -
Двоичный алгоритм 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; }