본문 바로가기

알고리즘을 위한 간략 정리/정수론

유클리드 호제법 - 최대공약수와 최소공배수 구하기

정의

- 유클리드 호제법 또는 유클리드 알고리즘은 2개의 자연수 또는 정식의

최대공약수를 구하는 알고리즘의 하나이다.

 

- 호제법이란 말은 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 나타낸다.

 

- 2개의 자연수 a, b에 대하여 a를 b로 나눈 나머지를 r이라 하면 (단, a > b),

a와 b의 최대공약수는 b와 r의 최대공약수와 같다.

- 위의 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여

나머지가 0이 되었을 때 나누는 수가 a와 b의 최대 공약수이다.

 

※ 출처: 위키백과/유클리드 호제법

 

 

 

예제(간단)

- 60과 42의 최대 공약수를 구해보자.

 

1. GCD(60, 42)

60 % 42 = 18

 

2. GCD(42, 18)

42 % 18 = 6

 

3. GCD(18, 6)

18 % 6 = 0

 

==> GCD(60, 42) = 6

 

 

 

최소공배수 구하기

최대공약수는 유클리드 호제법을 통하여 구할 수 있었다.

그렇다면 최소공배수는 어떻게 구할 수 있을까??

 

매우 간단하다.

 

두 자연수 a, b의 최대공약수를 유클리드 호제법을 통하여 구했다면,

두 자연수의 곱 = 최대공약수와 최소공배수의 곱

의 성질을 이용하여 쉽게 구할 수 있다!

 

a * b = 최대공약수 * 최소공배수

최소공배수 = a * b / 최대공약수

 

 

 

코드로 표현하기

두 자연수 a, b가 주어졌을 때

 

최대공약수와 최소공배수를 각각 구하는 코드이다.

#include <iostream>
using namespace std;

int gcd(int a, int b){
    int r = a % b;
    while(r > 0){
        a = b;
        b = r;
        r = a % b;
    }

    return b;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int a, b;
    cin>>a>>b;

    cout<<gcd(a, b)<<"\n";
    cout<<a * b / gcd(a, b);
    return 0;
}