이클립스 최대공약수구하는코딩인대 최대공약수 12가안나오는이유점요

조회수 1224회

import java.util.*; public class area {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    double x,y,division;
    division=1;
    Scanner input = new Scanner(System.in);
    System.out.println("두개의정수를입력하시오");

    x=input.nextDouble();
    y=input.nextDouble();

    while(x%division!=0&&y%division!=0)
    {


    ++division;










    }
    System.out.println("최대공약수="+division);
}   

}strong text

  1. List item`

여기에 코드를 입력하세요

`

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • System.out.println을 활용하시면 코드가 어디서 시작해서 어디서 멈추는 지 확인하실 수 있습니다.

    // import java.util.*;
    
    public class area {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            double x,y,division;
            division=1;
            // Scanner input = new Scanner(System.in);
            // System.out.println("두개의정수를입력하시오");
            x=24.0; // 테스트용 임의 x값
            y=36.0; // 테스트용 임의 y값
    
            while(x%division!=0&&y%division!=0)
            {
            System.out.println("현재 division의 값은 " + division + "입니다.");
            ++division;
            }
        }
    
    }
    

    x와 y가 둘다 division으로 나뉘어졌을 때 나머지가 0이 아닐 때 (약수가 아닐 때) division을 증가하시는 코드를 작성하셨습니다. 문제가 몇 가지 있는데,

    1. 자료형 double은 소수를 담습니다. 소수점으로 나누어지는게 가능합니다. 예를 들어 x의 값이 6.0, y의 값이 9.0일 때 division이 2.0면 각각 3.0과 4.5로 나뉘어 질 수 있습니다. 최대공약수를 구하는 데에 부적합한 자료형인 것으로 보입니다.
    2. 실행해보시면 아예 아무 것도 프린트 되지 않는데, 이 코드는 division이 1일 때 while문의 조건문을 만족하지 못하고 종료된다는 것을 아실 수 있을 것입니다. x와 y는 둘 다 1로 나누어 떨어지기 때문입니다. 하지만 division의 초기값 변경으로 문제를 해결할 수 있는 건 아닌 것이, 이 코드는 division이 x의 약수가 아니면서, y의 약수도 아닐 때 while문이 작동하기 때문입니다. 그렇다고 !===로 바꿔도, division이 x와 y의 약수일 때 while문이 돌아가다가 약수가 아닌 수를 만나면 (예를 들어 x가 24, y가 36이고 division이 5일 때) 멈춰버립니다.

    자료형을 정수형으로 바꾸고, 공약수를 최대공약수까지 증가시키려면

    // import java.util.*;
    
    public class area {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int x,y,division,gcd;
            division=1;
            // Scanner input = new Scanner(System.in);
            // System.out.println("두개의정수를입력하시오");
            x=24; // 테스트용 임의 x값
            y=36; // 테스트용 임의 y값
            gcd=1; // 최대공약수를 담는 GCD 초기화
    
            while(division<=x&&division<=y)
            {
                System.out.println("현재 division의 값은 " + division + "입니다.");
                if(x%division==0&&y%division==0)
                {
                    System.out.println(division + "은 x와 y의 공약수입니다.");
                    gcd = division;
                }
                ++division;
            }
            System.out.println("x와 y의 최대공약수는 " + gcd + "입니다.");
        }
    
    }
    

    이렇게 해보세요

    참고로 x와 y를 직접 division으로 나누고, 그 약수들을 다 곱해서 최대공약수를 구하는 방식은

    // import java.util.*;
    
    public class area {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int x,y,division,gcd;
            division=2;
            // Scanner input = new Scanner(System.in);
            // System.out.println("두개의정수를입력하시오");
            x=24; // 테스트용 임의 x값
            y=36; // 테스트용 임의 y값
            gcd=1; // GCD == 최대공약수
    
            while(division<=x&&division<=y)
            {
                System.out.println("현재 division의 값은 " + division + "입니다.");
                System.out.println("현재 x의 값은 " + x + ", y의 값은 " + y + "입니다.");
                if(x%division!=0||y%division!=0)
                {
                    ++division;
                }
                else
                {
                    x = x / division;
                    y = y / division;
                    gcd = gcd * division;
                }
            }
            System.out.println("x와 y의 최대공약수는 " + gcd + "입니다.");
        }
    
    }
    

    이렇게 해보실 수 있겠습니다.

  • x , y 에 무슨 값이 들어가든 1로는 딱 나눠 떨어지기 때문입니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)