알고리즘 이론

유클리드 호제법 JAVA

행수쌤 2023. 2. 21. 22:07
728x90
반응형

두 양의 정수 혹은 두 다항식의 최대공약수를 구하는 방법.

작은 수를 a, 큰 수를 b라 하고 b는 a로 나누어 떨어지지 않는다면

b = a * q + r 로 나타낼 수 있다(q : 몫, r : 나머지)

이 때 나눈 수인 a는 나머지인 r보다 크므로 a를 r로 나눌 수 있게 되는데,

a = r * q' + r'으로 나타낼 수 있고 이는

b = (r * q' + r') * q + r 이 된다. 만약 여기서 r' = 0 이라면 b = (r * q') * q + r 로 나타내어

a 와 b 모두 r을 인수로 갖고 있음을 알 수 있는데  이 규칙대로 숫자를 계속해서 나눈다면

마지막 나머지가 0 이 됐을 때 전체 숫자는 나눈 수를 인수로 갖게 되므로 그 수가 최대공약수가 된다.

 

예시 코드)

public class MaxCommon {
	public static void main(String[] args) {
		int a = 78696;
	    int b = 19332;
	    int commonNum = common(a, b);
	    System.out.println("최대공약수 : "+commonNum);
	}

	public static int common(int a, int b) {
	    int min = Math.min(a, b);
	    int max = Math.max(a, b);
	    while(min!=0) {
	        int rest = max%min;	//큰 수를 작은수로 나눈 나머지
	        max = min;	//나눈 수(작은 수)가 나뉘어질 수가 됨
	        min = rest;	//나머지가 나눌 수가 됨
	    }	
	    return max;		//나머지가 0이 되면 나눈 수 반환
	}
}

 

728x90
반응형