본문 바로가기

JAVA/Example

for문을 이용하여 소수 구하기

소수 구하기
소수를 구하기에 앞서 소수에 대해 설명을 하자면
소수는 1보다 큰 수 중에서 "1과 자기 자신 외의 자연수로 나뉘어지지 않는 수"를 소수라 하고 (약수가 2개)
합성수 1보다 큰 수 중 "1과 자기자신 외의 자연수로도 나뉘어 지는 수"를 합성수라 한다
자연수 : 1이상의 정수
ex) 2 : 1그리고 2로 나누어짐 -소수
10 : 1, 2, 5, 10 으로 나뉘어짐-합성수
11 : 1과 11로밖에 안나뉘어짐 - 소수
12 : 1,2,3,4,6,12로 나뉘어짐 -합성수
 
그러므로 소수를 구하려면 1과 자기자신 외에도 나뉘어지는 수가 있다면 그것은 소수가 아님을 이용해 구할수 있다
= 2과 n-1사이 나뉘어지는게 단 한개라도 있다면 그것은 소수가아님(=합성수)
여기서 n은 자기자신의 수를 n이라고 쓴것이라 2~n-1이라 쓴것 (1과 자기자신을 제외한것중 나뉘어지는걸 찾는것이므로)
 
반복 실행문인 for문을 사용해서 풀어본다면
 
나 자신의수에 사용할 for를 한개 넣고
나 자신에게 대입할 수 for를 한개 더 넣는다고 생각하면되는데
그렇게하면 아래와같이 쓸수있다.
 
//여기서 x는 나 자신의 수
//y는 x에게 대입하는 수

    public static void main(String[] args) {
 
        int pandan=0; //이 변수는 소수인지 합성수인지 판단하는것
        for(int x=2;x<100;x++){ //소수는 1보다 큰 자연수 중 구해야 하므로 2부터 시작을 한다.
            for(int y=2;y<x;y++){ // y=2 ; y<x 는 위에서 설명한 2~n-1과 같은뜻이다
                //System.out.println("x="+x);  //필요한 구문은 아니지만 나자신의 수에 대입하는 과정을 보기위해 써둿다
                //System.out.println("y="+y); //이것또한 정답을 도출하는데 필요한 구문은 x에게 대입하는 y의 수를 썻다
                if(x%y==0) { 
                    pandan=1; //x가(자기자신의 수가) y(2~n-1사이의 수중)로 나뉘어 질 경우
                    break;        //이것은 합성수가 되므로  pandan이라는 변수값을 1로 바꾼후
                                      //현재 이 for문 (y를 카운트 하는 for문)에서 빠져나온다(break;)
                }  
            }
            if(pandan==0) System.out.println(x); //이 if문은 x를 카운트하는 for문 안에 속해있는것
                                                    //바로 위위위 문단에서 pandan이 1로바뀌는경우는 합성수 일 경우고
                                                    //pandan의 값이 0 그대로라면 소수 이므로 x를 출력해준다
           
            pandan=0//여기서 0으로 다시 바꾸는 이유는 y카운트를 하는 for문에서 합성수일경우
                              // 1로바뀐 pandan을 다시 0으로 바꾸어 위에있는 if문에서 사용하기 위함이다
                             // 계속 1로 바뀌어있다면 소수일경우에도 위에있는 if(pandan==0)을 못써먹기 때문
        }
       
    }

}