loading
본문 바로가기
Coding/Java code

[ Java _ code ] 약수, 최대공약수, 최대공배수 구하기

by NeuLyeo 2023. 11. 23.

[ Java _ code ] 약수, 최대공약수, 최대공배수 구하기

 

 

 

📚 Table of Contents

     

     

     

     

     

    약수

    💡 약수 (Divisor) 란?

    어떤 수를 나누어 떨어지게 하는 수를 그 수의 약수라고 한다

    .예를 들어 10의 약수는 1, 2, 5, 10 이다.

     

     

     

    반복문을 이용하여 구하기

     

    모든 수를 돌아야 하기 때문에 수가 커질 수록 비효율 적이다.

     

    public ArrayList getDivisor(int num) { 
    
        // 약수를 담을 배열 생성
        ArrayList result = new ArrayList();  
    
        // 1부터 파라미터로 전달받은 숫자(num)까지 반복
        for (int i = 1; i <= num; i++){  
    
            // 나누어 떨어지는 경우 배열에 추가
            if (num % i ==0){  
                result.add(i);  
            }  
        }  
        result.add(num);  
    
        return result;  
    }

     

     

     

    제곱근을 이용하여 약수 찾기

     

    💡 제곱근 (Square root) 이란?

    제곱의 반대 개념이다.

    실수 a에 대하여 x2 = a를 만족시키는 x가 존재할 때, 이 x를 a의 제곱근이다。

    4의 2승은 16이다. / 16의 제곱근은 4이다.

     

     

     

    num의 약수가 1일 때 다른 약수는 num/1 이 되므로 다른 하나의 약수는 num이 된다.

     

    즉, num 의 약수 중 하나가 i 일 때, 다른 약수 중 하나는 num / i 가 된다.

     

    public ArrayList getDivisorSR(int num) {  
    
        // 약수를 담을 배열 생성  
        ArrayList result = new ArrayList();  
    
        // 1부터 파라미터로 전달받은 숫자(num)까지 반복  
        for (int i = 1; i <= (int)Math.sqrt(num); i++) {  
    
            // 나누어 떨어지는 경우 배열에 추가  
            if (num % i == 0) {  
                result.add(i);  
                if (i != num / i) {  
                    result.add(num / i);  
                }  
    
            }  
        }
    
        // 배열 오름차순 정렬  
        result.sort(Comparator.naturalOrder());  
        return result;  
    } 

     

     

     

     

     

    최대공약수, 최대공배수 구하기

     

    위의 약수를 구하는 함수를 이용하여 최대 공약수, 최대 공배수를 구한다.

     

     

    최대 공약수 ( GCD : the Greatest Common Denominator )

    💡최대 공약수란

    서로 다른 두 자연수의 공통된 약수를 공약수라 한다.

    공약수 중에서 가장 큰 수최대 공약수라 한다.

    12의 약수 = 1, 2, 3, 4, 6, 12
    18의 약수 = 1, 2, 3, 6, 9, 18

    공약수 = 1, 2, 3, 6
    최대 공약수 = 6

     

    public int getGCD(int numA, int numB) {  
        int gcd = -1;  
    
        ArrayList divisorA = this.getDivisor(numA);  
        ArrayList divisorB = this.getDivisor(numB);  
    
        // numA의 약수 배열을 순환
        for (int itemA : (ArrayList<Integer>) divisorA) {
    
            // numB의 약수 배열을 순환
            for (int itemB : (ArrayList<Integer>) divisorB) {  
    
                // A의 약수와 B의 약수가 같은경우
                if (itemA == itemB) { 
    
                    // 같은 경우에서 가장 큰수를 저장한다.
                    if (itemA > gcd) {  
                        gcd = itemA;  
                    }  
                }  
            }  
        }  
        return gcd;  
    }

     

     

     

    최대 공배수 ( LCM : the Lowest Common Multiple )

    💡최대 공배수란?

    공배수 중에서 가장 작은 수최소 공배수라 한다.

    2와 3의 배수를 구하면 공통된 배수를 확인할 수 있다.

    이것을 공배수라 한다.

    2의 배수 = 2, 4, 6, 8, 10, 12 .....
    3의 배수 = 3, 6, 9, 12, 15, ......
    공배수 = 6. 12. 18. 24. 30

     

    public int getLCM(int numA, int numB) {  
        int lcm = -1;  
    
        // 최대 공약수를 구한다.
        int gcd = getGCD(numA, numB);  
    
        // 최대 공약수가 -1이 아닌 경우
        if (gcd != -1) {  
    
            // 최대 공배수는 A * B / 최대 공약수 이다.
            lcm = numA * numB / gcd;  
        }  
    
        return lcm;  
    }

     

     

     

    code test

    int number1 = 1984;  
    int number2 = 3524;  
    
    Main test = new Main();  
    ArrayList l1 = test.getDivisor(number1);  
    ArrayList l2 = test.getDivisorSR(number2);
    
    System.out.println("number1의 약수 : " + l1);  
    // number1의 약수 : [1, 2, 4, 8, 16, 31, 32, 62, 64, 124, 248, 496, 992, 1984]
    
    System.out.println("number2의 약수 : " + l2);  
    // number2의 약수 : [1, 2, 4, 881, 1762, 3524] 
    
    System.out.println("최대 공약수 : " + p.getGCD(number1, number2));  
    // 최대 공약수 : 4
    
    System.out.println("최대 공배수 : " + p.getLCM(number1, number2));
    // 최대 공배수 : 1747904