# 최대 공약수 & 최소 공배수 --> // 두 자연수의 곱 == 최대 공약수 * 최소 공배수
## 약수
- 해당 수를 나눠서 나머지가 0이 되는 수
- ** 해당 수 /2 까지 나머지가 0인 수 + 해당 수 **
## 최대 공약수
- 두 수의 약수 중 공통적으로 나오는 약수이면서 가장 큰 수
## 최소 공배수
- 배수 중 공통적으로 배수면서 가장 작은 수
- 최소 공배수 == (a * b) / GCD(a, b) <- **두 원소 곱하고 최대 공약수로 나누기.**
public class Practice {
// 약수 --> 나눠서 나머지가 발생하지 않는 수
public List<Integer> getDivisor(int num) {
List<Integer> result = new ArrayList();
for (int i = 1; i <= num / 2; i++) { // 절반까지 체크
if (num % i == 0) {
result.add(i);
}
}
result.add(num); // 자기 자신도 약수..
return result;
}
// 최대 공약수
// GCD: the Greatest Common Denominator
public int getGCD(int numA, int numB) {
int gcd = -1;
List<Integer> aDvisors = getDivisor(numA);
List<Integer> bDvisors = getDivisor(numB);
for (int itemA : aDvisors) {
for (int itemB : bDvisors) {
if (itemA == itemB && gcd < itemA) {
gcd = itemA;
}
}
}
return gcd;
}
// 최소 공배수 == (a * b) / GCD(a, b) <- 두 원소 곱하고 최대 공약수로 나누기.
// LCM: the Lowest Common Multiple
public int getLCM(int numA, int numB) {
int lcm = -1;
int gcd = this.getGCD(numA, numB);
if (gcd == -1) {
lcm = numA * numB / gcd;
}
return lcm;
}
public static void main(String[] args) {
// Test code
int number1 = 10;
int number2 = 6;
Practice p = new Practice();
List<Integer> l1 = p.getDivisor(number1); // 10: 1, 2, 5, 10
List<Integer> l2 = p.getDivisor(number2); // 6: 1, 2, 3, 6
System.out.println("l1 = " + l1);
System.out.println("l2 = " + l2);
System.out.println("최대 공약수: " + p.getGCD(number1, number2));
System.out.println("최대 공배수: " + p.getLCM(number1, number2));
}
}