Algorithm

유클리드 호제법(Euclidean Algorithm)

Data Engineer 2015. 8. 8. 23:39

유클리드 알고리즘(Euclidean Algorithm)

최대공약수를 구하는 알고리즘으로, 일반적으로 사람이 최대공약수를 구할 경우 직관적으로 구할 수 있지만 컴퓨터는 그렇지 않다. 이 경우 유클리드 알고리즘을 사용하면 컴퓨터에서 손쉽게 최대공약수를 구할 수 있다.


유클리드 알고리즘

임의의 두 정수 u, v에 대해

(1) v가 u보다 크다면 v와 u의 값을 바꾼다.

(2) u = u - v 

(3) u가 0이면 v가 최대공약수, 0이 아니면 (1)로 돌아간다.


소스코드

#include 

using namespace std;

int main(void)
{
	int u = 280;
	int v = 30;
	int tmp = 0;

	while (u > 0) {
		if (v > u) {
			tmp = u;
			u = v;
			v = tmp;
		}
		u = u - v;
	}

	cout << v << endl;
	return 0;
}

개선된 유클리드 알고리즘

위에서 설명한 알고리즘의 경우 뺄셈을 기반으로 동작하는데, u와 v의 차이가 클 경우 많은 뺄셈 연산을 수행해야 하는 단점이 존재한다. 그러나 여기서 규칙을 잘 살펴 보면 뺄셈의 결과는 나눗셈의 나머지를 구하는 것을 알 수 있다. 개선된 알고리즘은 아래와 같다.


임의의 두 정수 u, v에 대해 

(1) v가 0이 아니면

  (1.1) u = u % v 

  (1.2) u와 v를 교환 

  (1.3) (1)로 돌아감 

(2) v가 0이면 u가 최대공약

 

소스코드

int main(void) {
	int u = 280;
	int v = 30;
	int tmp = 0;

	while (v > 0) {
		tmp = u % v;
		u = v;
		v = tmp;
	}

	cout << u << endl;
	return 0;
}