欧几里德算法,扩展的欧几里德算法
2013-09-20 10:28
211 查看
1.欧几里德算法
:求最大公约数
:求最小公倍数
2.扩展的欧几里德算法
:求最大公约数
:求最小公倍数
:求最大公约数
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) ; }