[Java] 입력 받은 수가 소수인지 판별하기

haeun_06·2022년 7월 6일
0

JAVA_예제

목록 보기
6/23
post-thumbnail

0706


문제

반복문을 사용하여 입력 받은 수가 소수인지 판별하는 프로그램을

작성하라

Ex)
숫자를 입력하시오 : 13
소수입니다.

숫자를 입력하시오 : 10
소수가 아닙니다.

소스

import java.util.Scanner;
public class Prime {
	 public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("숫자를 입력하시오 : ");
        // num : 입력받은 수
		int num = sc.nextInt();

		// isPrime : 소수인지 판별
		boolean isPrime = true;

		// i : num에 나눌 값, for문을 한 바퀴 돌 때마다 1씩 증가한다.
        // 변수 i를 num/2만큼만 반복하게 해서 반복횟수를 줄인다.
		for(int i = 2; i <= num/2; i++) {
        	// 순차적으로 i를 num에 나누어본다.
			if(num%i == 0) {
            	// num이 i로 나눠져 나머지가 0이 되면 isPrime에 false(소수가 아님)을 입력한다.
				isPrime = false;
                // 이미 1과 자기자신 외에 다른 수로도 나눠져 합성수임을 알았으므로 더 이상 반복하지 않고 빠져나온다.
				break;
			}
		}
        // 삼항 연산자를 사용하여 isPrime이 true이면 "소수입니다."를 출력한다.
        // isPrime이 false라면 "소수가 아닙니다."를 출력한다.
		System.out.printf(isPrime ? "소수입니다." : "소수가 아닙니다.");
	}
}

소스 풀이

  1. boolean isPrime을 사용한 이유

    • boolean타입은 truefalse만을 나타내는 논리형입니다. 그래서 값이 true일 경우 소수입니다.를 출력하고 값이 false일 경우 소수가 아닙니다.를 출력하는 삼항연산자를 사용하였고, 이것으로 코드를 단순화시킬 수 있었습니다.
  2. i <= num/2를 사용한 이유

    • inum까지 돌리지 않고 절반까지만 반복해도 값을 충분히 구할 수 있기 때문입니다.

    이것은 예시로 바로 보여드리겠습니다.

    • 만약 제가 13을 입력한다면 num에는 13이 저장이 되고 i는 13의 절반인 6이 저장될 것입니다. 순서대로 13/2, 13/3, 13/4, 13/5, 13/6을 해도 나눠지지 않으니 isPrimetrue가 초깃값 그대로 저장되면서 소수입니다.가 출력됩니다.

    • 만약 제가 4를 입력한다면 num에는 4가 저장되고, i에는 4의 절반인 2가 저장이 될 것입니다. 순서대로 4/2를 했을 때에 num % i == 0가 성립이 되므로 isPrimefalse가 저장이 되면서 소수가 아닙니다.가 출력됩니다.

  3. break를 사용한 이유

    • 이미 값이 구해진 상황에서 의미없는 반복문을 돌리는 것은 낭비이기 때문입니다.
      소수란 1과 자기 자신만을 약수로 가지는 수를 의미하는데 이 소스에서 if ( num % i == 0이 실행된다는 것은 이미 num의 값이 합성수임을 의미하는 것입니다. 따라서 isPrimefalse를 저장한 후 바로 빠져나와도 값에 별 이상이 없습니다.

실행 결과

Ex)
숫자를 입력하시오 : 19
소수입니다.

숫자를 입력하시오 : 169
소수가 아닙니다.


profile
개발새발 블로그

0개의 댓글