유클리드 호제법은 두 수의 최대공약수를 빠르게 구하는 알고리즘이다.
최대공약수(GCD) | 를 로 나눈 몫을 𝑄라 하고, 나머지를 𝑅이라 할때, 이다. |
최소공배수(LCM) | A와 B라는 다른 수가 주어졌을때, 주어진 두 개의 수를 곱한 값을 GCD로 나눈 값이다. |
조금 머리가 아프다...
수능에는 안 나오지만 컴퓨터 공학를 이용한 계산에 쓰이는 정수론에 가장 많이 쓰인다고 한다.
자세한 글과 증명법은 https://dimenchoi.tistory.com/46 을 참고하면 좋다.
중학수학에서 두 수 사이의 최대공약수는 소인수분해를 한 후
그 소인수들의 곱으로 구할 수 있었지만
효율적인 방법은 아니다.
왜냐하면 우선 소인수분해를 위해 소수를 먼저 찾아야 하고
찾은 소수가 두 개의 수를 나눌 수 있는지 확인을 하는 절차를 거쳐야 하기 때문에
수가 크면 계산이 복잡해지는 단점이 있기 때문에 이를 보완하기 위해 나온 방법이다.
자바 코드로 살펴보겠다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class LCMCalculator {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 사용자로부터 첫 번째 정수 입력 받기
System.out.print("첫 번째 정수를 입력하세요: ");
int a = Integer.parseInt(br.readLine());
// 사용자로부터 두 번째 정수 입력 받기
System.out.print("두 번째 정수를 입력하세요: ");
int b = Integer.parseInt(br.readLine());
// 최대공약수 계산
int gcd = findGCD(a, b);
// 최소공배수 계산
int lcm = findLCM(a, b, gcd);
System.out.println("두 정수의 최대공약수는 " + gcd + "입니다.");
System.out.println("두 정수의 최소공배수는 " + lcm + "입니다.");
br.close();
}
/**
* 두 정수의 최대공약수(GCD)를 구하는 함수
* @param a 첫 번째 정수
* @param b 두 번째 정수
* @return a와 b의 최대공약수
*/
public static int findGCD(int a, int b) {
// 유클리드 호제법을 사용하여 최대공약수 구하기
// a와 b 중에서 큰 값을 a로, 작은 값을 b로 설정하여 시작
while (b != 0) {
int temp = b; // b를 임시 변수 temp에 저장
b = a % b; // a를 b로 나눈 나머지를 b에 저장 (나머지 연산)
a = temp; // temp에 저장된 값을 a에 대입하여 반복
}
return a; // b가 0이 되면 반복문을 종료하고 a가 최대공약수가 됨
}
/**
* 두 정수의 최소공배수(LCM)를 구하는 함수
* @param a 첫 번째 정수
* @param b 두 번째 정수
* @param gcd a와 b의 최대공약수
* @return a와 b의 최소공배수
*/
public static int findLCM(int a, int b, int gcd) {
// 최소공배수는 두 수의 곱을 최대공약수로 나눈 값과 같다
return (a * b) / gcd;
}
}
'자료구조 > 알고리즘 기초수학' 카테고리의 다른 글
Hash Table / Deque (5) | 2024.07.16 |
---|---|
선형 자료구조 스택, 큐, 리스트 (0) | 2024.07.08 |
이항계수, 동적계획법 (0) | 2024.07.06 |
에라토스테네스의 체 (1) | 2024.07.02 |
알고리즘 / 문자열 (1) | 2024.07.01 |