Искусство программирования Кнута, третье издание, и пример евклидова алгоритма

Я только начал читать том 1 искусства Кнута по программированию и попал в раздел на странице 4, где он описывает евклидов алгоритм. Он утверждает шаги, чтобы найти наибольший общий делитель двух чисел. Вы можете прочитать больше об этом здесь https://en.wikipedia.org/wiki/Euclidean_algorithm

Он рассматривает пример нахождения GCD 199 и 544, который он заявляет 17 в качестве ответа. Я быстро реализовал алгоритм, чтобы просто следовать, но получил ответ 1. Используя свой калькулятор, я также получил ответ 1.

мой код

#import <math.h>
#import <stdio.h>

double GreatestComminDivisor(int m, int n) {

    double r = fmod(m, n);
    if (m < n) {
        int temp = n;
        n = m;
        m = temp;
    }

    while (r != 0) {
        r = fmod(m, n);

        if (r == 0) {
            return n;
        }

        m = n;
        n = r;
    }

    return n;
}

int main(int argc, char const *argv[]) {

  int m = 199;
  int n = 544;
  double answer = GreatestComminDivisor(m, n);

  printf("GCD of %i and %i is %f \n", m, n, answer);

  return 0;
}

Неужели я что-то упустил в его примере? Я пытался найти список ошибок для третьего издания книги и не получил никаких результатов. Просто хочу убедиться, что я не сойду с ума.

2 ответа

Решение

Вот пример функции GCD

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

И цифры 119 и 544.

Безрекурсный алгоритм на основе уже принятого ответа:

int gcd (int a, int b)
{
  int mod;

  while((mod = a % b) != 0)
  {
    a = b;
    b = mod;
  }

  return b;
}
Другие вопросы по тегам