Euclidean algorithm (Find gcd of two numbers)
An efficient method for finding the greatest common divisor was discovered by the ancient Greeks over two thousand years ago: it is called Euclid’s algorithm because it is spelled out in detail in Euclid’s famous treatise Elements
Euclid’s method is based on the fact that if u is greater than v then the greatest common divisor of u and v is the same as the greatest common divisor of v and u - v. This observation leads to the following implementation in C (gcd1).
The implementation in gcd1 can be improved by noting that, once u > v, we continue to subtract off multiples of v from u until reaching a number less than v. But this number is exactly the same as the remainder left after dividing u by v, which is what the modulus operator (%) computes: the greatest common divisor of u and v is the same as the greatest common divisor of v and u % v (gcd2).
#include <stdio.h>
#include <time.h>
# ordinary method
int gcd1(int u, int v)
{
int t;
while(u!=v)
{
if(u<v) v=v-u;
else u=u-v;
}
return u;
}
#recursive version
int gcd2(int u, int v)
{
int t;
if(v==0)
return u;
else
return gcd2(v, u%v);
}
void main()
{
int x,y;
while(scanf("%d %d", &x, &y) != EOF)
{
if(x>0 && y>0)
{
clock_t start,end;
start=clock();
printf("%d %d %d\n",x,y,gcd1(x,y));
end = clock();
double t1=end-start;
start=clock();
printf("%d %d %d\n",x,y,gcd2(x,y));
end = clock();
double t2=end-start;
printf("%lf %lf ratio=%lf\n", t1, t2, t1/t2);
}
}
}
Note how much more efficient the modification is when, for example, finding the greatest common divisor of a very large number and a very small number. It turns out that this algorithm always uses a relatively small number of steps.