辗转相除法求最大公约数

辗转相除法(欧几里德算法)算是求最大公约数(greatest common divisor gcd)比较经典而且简单的算法了,其理论依据如下:
if y=0, gcd(x,y) = x
if x>=y>0 gcd( x,y) = gcd( y, x mod y) 
简单证明如下,设x = y*p +r ( r = x mod y),如果存在数q整除x, y, 也即 q|x = q|(y*p +r) = q|(y*p) + q|r ==> q|r

简单递归实现如下:

int gcd( int x, int y)
{
    
if(!y)
        
return x;
    
return gcd(y,x%y);
}

注意到它是一个tail recursion,所在将其改为非递归实现也比较简单,代码如下:

int gcd_no_rec( int x, int y)
{
    
if(!y)
        
return x;
    
while(y>0)
  
{
        
int temp = y;
        y 
= x%y;
        x 
= temp;
    }

    
return x;
}
posted @ 2007-10-06 18:34  芭蕉  阅读(459)  评论(0)    收藏  举报