辗转相除法求最大公约数
辗转相除法(欧几里德算法)算是求最大公约数(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;
}
浙公网安备 33010602011771号