웅재의 코딩세상

유클리드 알고리즘 본문

개념/알고리즘

유클리드 알고리즘

웅드 2023. 11. 23. 21:20

최대공약수 (GCD)

  • 주어지는 두 정수의 약수 중에서 가장 큰 공통 약수이다.
  • 소인수분해를 통해 GCD를 구할 수 있다.
  • 뻴셈 기반의 알고리즘이다.
  • GCD(u,v) = GCD(u-v,v) if u > v
  • GCD(u,0) = u

GCD(100,30) = GCD(70,30) = GCD(40,30) = GCD(10,30) = GCD(30,10)

= GCD(20,10) = GCD(10,10) = GCD(0,10) = 10

 

코드 구현하기

int get_gcd(int u, int v){

    int t;
    while(u){
    	if(u<v){ //u가 v보다 작으면 두 수를 바꾼다.
        	t = u;
            u = v;
            v = t;
        }
        u = u-v;
    }
    return v;
}

 

뺄셈 기반 알고리즘의 문제

 - u와 v의 값 차이가 클 때 많은 뺄셈을 요구한다.

 - 뺄셈의 결과는 나눗셈의 나머지를 구하는 것

 

임의의 두 정수 u,v에 대해 v가 0이 아니면

u = u%v.  -> 항상 u%v < v 여야한다.

u 와 v를 교환

이때 v가 0이면 u 가 GCD가 된다.

GCD(100,30) = GCD(10,30) = GCD(30,10) = GCD(0,10) = GCD(10,0) = 10

 

코드 구현하기

int get_gcd(int u, int v){

    int t;
    while(v){
    	t = u % v;
        u = v;
        v = t;
    }
	return u;
} // 나눗셈을 이용하여 풀이

int gcd_recursion(int u, int v){

    if(v==0) return u;
    else return gcd_recursion(v,u%v);
} // 재귀함수를 사용하여 풀이
반응형

'개념 > 알고리즘' 카테고리의 다른 글

미로 탐색 알고리즘 : 우선법  (1) 2023.11.26
미로탐색 2  (0) 2023.11.26
배열의 정의 (미로 탐색 1)  (0) 2023.11.26
소수 판별 알고리즘  (1) 2023.11.23
자료구조와 알고리즘  (2) 2023.11.23