Написать вариант алгоритма Евклида, использующий соотношения НОД - C (СИ)

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

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

Здравствуйте! Задача состоит в том, чтобы "Написать вариант алгоритма Евклида, использующий соотношения НОД(2a, 2b) = 2•НОД(a,b), НОД(2a,b) = НОД(a,b) при нечётном b, не включающий деления с остатком, а использующий лишь деление на 2 и проверку чётности. (Число действий должно быть порядка log k для исходных данных, не превосходящих k.)" И я, извините за глупость, не понимаю чего же от меня хотят, особенно часть "НОД(2a, 2b) = 2*НОД(a,b), НОД(2a,b) = НОД(a,b)". Т.е вместо обычного алгоритма нахождения нода делением меня просят написать код, основывающийся на этих равенствах? Если кто сталкивался с подобной задачей, прошу помочь.

Решение задачи: «Написать вариант алгоритма Евклида, использующий соотношения НОД»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. /* обычная версия */
  4. int gcd(int a, int b)
  5. {
  6.     if (b == 0)
  7.         return a;
  8.     return gcd(b, a % b);
  9. }
  10.  
  11. /* через деление на 2 */
  12. int gcd2(int a, int b)
  13. {
  14.     if (a == 0)
  15.         return b;
  16.  
  17.     if ((b & 1) == 0)
  18.     {
  19.         if ((a & 1) == 0)
  20.             return 2 * gcd2(a / 2, b / 2);
  21.         return gcd2(b / 2, a);
  22.     }
  23.  
  24.     if ((a & 1) == 0)
  25.         return gcd2(a / 2, b);
  26.  
  27.     if (b > a)
  28.         return gcd2(b - a, a);
  29.  
  30.     return gcd2(a - b, b);
  31. }
  32.  
  33. int main(void)
  34. {
  35.     int a, b;
  36.     printf("Input a, b: ");
  37.     scanf("%d%d", &a, &b);
  38.     printf("\ngcd(%d, %d) = %d\n", a, b, gcd(a, b));
  39.     printf("gcd2(%d, %d) = %d\n", a, b, gcd2(a, b));
  40.     return 0;
  41. }

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

  1. Обычная версия, представленная функцией gcd, реализует алгоритм Евклида с использованием операции модуля. Если делитель равен 0, то возвращается делимое. В противном случае, функция рекурсивно вызывается для оставшегося делителя и делимого, уменьшенного на остаток от деления на этот делитель.
  2. Версия через деление на 2, представленная функцией gcd2, использует деление на 2 и логику обработки остатков от деления. Если делимое равно 0, то возвращается делитель. Если делитель делится на 2 без остатка, то функция рекурсивно вызывается для половины делителя и половины делимого. Если делитель не делится на 2 без остатка и делимое не равно 0, то функция рекурсивно вызывается для половины делимого и половины делителя. Если делитель больше делимого, то функция рекурсивно вызывается для разности делимого и делителя и делимого. Если делимое больше делителя, то функция рекурсивно вызывается для разности делителя и делимого и делимого. В обоих случаях возвращается результат рекурсивного вызова.
  3. В функции main считываются два целых числа, затем вызывается функция gcd и gcd2 для этих чисел, и выводятся результаты на экран.

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


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

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

9   голосов , оценка 4.222 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы