1.欧几里德算法
:求最大公约数
unsigned Gcd(unsigned n , unsigned m)
{
int max = n > m ? n : m ;
int min = n + m - max ;
int temp ;
while((temp = max % min))
{
max = min ;
min = temp ;
}
return min ;
}
:求最小公倍数
unsigned Lcm(unsigned n , unsigned m)
{
return n * m / Gcd(n , m) ;
}
2.扩展的欧几里德算法
:求最大公约数
unsigned Gcd2(unsigned n , unsigned m)
{
int x[3] , y[3] ;
x[1] = y[0] = 1 ;
x[0] = y[1] = 0 ;
int max = n > m ? n : m ;
int min = n + m - max ;
int temp , i ;
for(i = 0 ; (temp = max % min) ; ++i)
{
x[(i+5)%3] = x[(i+4)%3] * (max / min) * (-1) + x[(i+3)%3] ;
y[(i+5)%3] = y[(i+4)%3] * (max / min) * (-1) + y[(i+3)%3] ;
max = min ;
min = temp ;
}
return x[(i+4)%3]*n + y[(i+4)%3]*m ;
}
:求最小公倍数
unsigned Lcm2(unsigned n , unsigned m)
{
return n * m / Gcd2(n , m) ;
}