Искусство программирования Кнута, третье издание, и пример евклидова алгоритма
Я только начал читать том 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;
}