반복문을 사용하여 입력 받은 수가 소수인지 판별하는 프로그램을
작성하라
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 ? "소수입니다." : "소수가 아닙니다.");
}
}
boolean isPrime
을 사용한 이유
boolean
타입은 true
와 false
만을 나타내는 논리형입니다. 그래서 값이 true
일 경우 소수입니다.
를 출력하고 값이 false
일 경우 소수가 아닙니다.
를 출력하는 삼항연산자를 사용하였고, 이것으로 코드를 단순화시킬 수 있었습니다.i <= num/2
를 사용한 이유
i
를 num
까지 돌리지 않고 절반까지만 반복해도 값을 충분히 구할 수 있기 때문입니다.이것은 예시로 바로 보여드리겠습니다.
만약 제가 13
을 입력한다면 num
에는 13이 저장이 되고 i
는 13의 절반인 6
이 저장될 것입니다. 순서대로 13/2, 13/3, 13/4, 13/5, 13/6을 해도 나눠지지 않으니 isPrime
에 true
가 초깃값 그대로 저장되면서 소수입니다.
가 출력됩니다.
만약 제가 4
를 입력한다면 num
에는 4가 저장되고, i
에는 4의 절반인 2
가 저장이 될 것입니다. 순서대로 4/2를 했을 때에 num % i == 0
가 성립이 되므로 isPrime
에 false
가 저장이 되면서 소수가 아닙니다.
가 출력됩니다.
break
를 사용한 이유
if ( num % i == 0
이 실행된다는 것은 이미 num
의 값이 합성수임을 의미하는 것입니다. 따라서 isPrime
에 false
를 저장한 후 바로 빠져나와도 값에 별 이상이 없습니다.Ex)
숫자를 입력하시오 : 19
소수입니다.
숫자를 입력하시오 : 169
소수가 아닙니다.