유클리드 알고리즘과 호제법
☞ 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다.
☞ 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다.
최대공약수(GCD: Greatest Common Divisor) & 최소공배수(LCM: Least Common Multiple)란?
☞ 최대공약수(GCD: Greatest Common Divisor)
: 두 수의 공통된 '약수 중에서 가장 큰 수'를 의미한다.
☞ 최소공배수(LCM: Least Common Multiple)
: 두 수의 공통된 '배수 중에서 가장 작은 수'를 의미한다.
두 수의 최대공약수, 최소공배수 구하기
최대공약수(GCD) 구현 방법
1. 반복문으로 구현
b가 0이 될 때까지, a를 b로 나눈 나머지를 b에 대입하고, a와 b의 값을 교환한다.
public static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
2. 재귀함수로 구현
b가 0이라면 a가 최대공약수가 되며, 그렇지 않으면 b와 a % b의 최대공약수를 구한다.
public static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
최소공배수(LCM) 구현 방법
최소 공배수는 두 수의 곱에 최대 공약수를 나눈 값과 같다.
public static int lcm(int a, int b) {
return a * b / gcd(a, b);
}
N개의 수의 최대공약수, 최소공배수 구하기
최대공약수(GCD)
배열을 순회하면서 배열에 있는 모든 수의 최대공약수를 구한다.
public static int gcd(int[] arr) {
int result = arr[0];
for (int i = 1; i < arr.length; i++) {
result = gcd(result, arr[i]);
}
return result;
}
public static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
최소공배수(LCM)
배열을 순회하면서 배열에 있는 모든 수의 최소공배수를 구한다.
public static int lcm(int[] arr) {
int result = arr[0];
for (int i = 1; i < arr.length; i++) {
result = lcm(result, arr[i]);
}
return result;
}
public static int lcm(int a, int b) {
return (a * b) / gcd(a, b);
}
참고
https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95
유클리드 호제법 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란
ko.wikipedia.org
'Alogorithm' 카테고리의 다른 글
[JAVA] 카데인 알고리즘(Kadane's Algorithm) (0) | 2024.08.14 |
---|---|
[JAVA] 다익스트라(Dijkstra) 알고리즘 (0) | 2024.07.02 |
[JAVA] 동적 계획법(Dynamic Programming) (0) | 2024.05.31 |
[JAVA] 깊이 우선 탐색 (DFS, Depth-First Search) (0) | 2024.05.16 |
[JAVA] 너비 우선 탐색 (BFS, Breadth-First Search) (0) | 2024.05.16 |