Написать рекурсивную функцию нахождения наибольшего общего делителя двух целых чисел - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Сделайте пожалуйста из моей обычной функции по нахождению НОДа

рекурсивную

#include <iostream>
#include <windows.h>
using namespace std;
 
char bufRus[256];
 
void main(void);
int nod(int, int);
char* Rus(const char*);
 
void main(void)
{
    cout << Rus("\t\tЗадание 2 к Домашнему заданию 4 к модулю 6.\n");
    cout << Rus("Написать рекурсивную функцию нахождения наибольшего общего делителя двух целых чисел.\n");
    int a, b;
    cout << (Rus("Введите первое число: \n "));
    cin >> a;
    while (a < 0)
    {
        cout << (Rus("\nОшибка: Число должно быть целым положительным. Будьте внимательны!!!"));
        cin >> a;
    }
    cout << (Rus("Введите второе число: \n"));
    cin >> b;
    while (b < 0)
    {
        cout << (Rus("\nОшибка: Число должно быть целым положительным. Будьте внимательны!!!"));
        cin >> b;
    }
    nod(a, b);
}
 
int nod(int a, int b)
{
    while (a && b)
    if (a >= b)
    {
        a %= b;
        cout << Rus("Наибольший общий делитель ваших чисел = ")<<b<<"\n";
    }
 
    else
    {
        b %= a;
        cout << Rus("Наибольший общий делитель ваших чисел = ") << a << "\n";
    }

    return a | b;
}
 
char* Rus(const char* text)
{
    CharToOemA(text, bufRus);
    return bufRus;
}

Решение задачи: «Написать рекурсивную функцию нахождения наибольшего общего делителя двух целых чисел»

textual
Листинг программы
int gmd(int  a,int  b)
{
    if(!b) return a;
    return gmd(b,a%b);
}

Объяснение кода листинга программы

  1. Входные параметры функции: a и b - два целых числа.
  2. Проверка условия: если b равно 0, то возвращается значение a.
  3. Если же b не равно 0, то происходит рекурсивный вызов функции gmd, но уже с параметрами b и (a % b).
  4. Значение (a % b) представляет собой остаток от деления a на b.
  5. Таким образом, в случае, если b не равно 0, функция gmd будет вызывать саму себя, пока не будет выполнено условие (b = 0).
  6. Когда условие выполняется, функция возвращает значение a.
  7. Функция gmd предназначена для нахождения наибольшего общего делителя (НОД) двух целых чисел.
  8. Рекурсивный алгоритм нахождения НОД является одним из самых простых и эффективных алгоритмов.
  9. Он основан на идее разложения обоих чисел на простые множители и поиска наибольшего общего делителя этих простых множителей.
  10. Но в данном коде алгоритм упрощен до нахождения остатка от деления, что также является корректным решением, но не является наиболее эффективным.
  11. Временная сложность данного алгоритма составляет O(log n), где n - это наибольшее из двух чисел.
  12. Поэтому, если необходимо найти НОД двух больших чисел, то данная реализация может быть неэффективной и может привести к переполнению стека вызовов.
  13. Однако, для небольших чисел, данная реализация может быть вполне приемлемой.
  14. В данном коде нет использования каких-либо дополнительных библиотек или структур данных.
  15. Код достаточно компактный и может быть использован в качестве самостоятельной функции или в составе другой функции.
  16. Данный код может быть использован для решения различных задач, связанных с нахождением НОД, например, для проверки целочисленности делителей или для нахождения обратного элемента в кольце по модулю.
  17. Важно отметить, что данная реализация не является единственной возможной и существуют и другие алгоритмы для нахождения НОД.
  18. Например, алгоритм Евклида, который также основан на рекурсии, но использует дополнительную переменную для хранения последнего ненулевого делителя.
  19. В данном коде не предусмотрена обработка ошибок, например, если входные значения отрицательны или превышают максимальное значение для типа данных int.
  20. Также в данном коде не предусмотрена оптимизация для ускорения работы алгоритма, например, использование таблицы предварительно вычисленных значений НОД для небольших чисел.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы