A와 B의 최대공약수를 구하는 알고리즘 문제를 풀었다.
코드 구현
public static void GCD(int A, int B) {
int gcd = 1;
for (int i = 2; i <= A && i <= B; i++) {
if (A % i == 0 && B % i == 0) {
gcd = i;
}
}
System.out.print(gcd);
}
시간복잡도는 이다.
결과는 시간초과가 발생하였다.. 아무래도 최대공약수를 구하는 더 효율적인 방법이 있는 것 같다.
소인수분해는 다음과 같은 방법으로 최대공약수를 구할 수 있다.
예시 1
코드 구현
public static void GCD(int A, int B) {
int gcd = 1;
for (int i = 2; i <= A && i <= B; i++) {
while (A % i == 0 && B % i == 0) {
gcd *= i;
A /= i;
B /= i;
}
}
System.out.print(gcd);
}
시간복잡도는 이다.
일반적으로 최대 공약수를 구하는 방법은 소인수분해를 이용한 공통된 소수들의 곱으로 표현할 수 있지만 다음에 소개할 유클리드 호제법은 좀더 간단한 방법을 제시한다.
%
A와 B의 최대공약수를 라고 하면, 이 성립한다.
유클리드 호제법은 다음과 같은 방법으로 최대공약수를 구할 수 있다.
예시 1
코드 구현
public static void GCD(int A, int B) {
while (B != 0) {
long temp = B;
B = A % B;
A = temp;
}
System.out.print(A);
}
시간복잡도는
예시 1
코드 구현
public static void LCM(int A, int B) {
int lcm = (A * B) / GCD(A, B);
System.out.print(lcm);
}
public static int GCD(int A, int B) {
while (B != 0) {
long temp = B;
B = A % B;
A = temp;
}
return A;
}