[计算最大公因子]Finding the greatest common divisor (gcd) of 2 numbers

来源:互联网 发布:淘宝7个层级流量怎么样 编辑:程序博客网 时间:2024/05/27 14:14

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 methodint gcd1(int u, int v){    int t;    while(u!=v)    {        if(u<v) v=v-u;        else    u=u-v;    }    return u;}#recursive versionint 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.

原创粉丝点击