Java 소수 판별 프로그램 (예제 포함)

⚡ 스마트 요약

Java 소수 판별 프로그램은 하나의 정수가 나누어 떨어지는지 판별하고 소수 또는 합성수인지 판별하는 방법을 보여줍니다. 이 글에서는 수학적 정의, 반복문 논리, 실행 가능한 전체 코드, 제곱근 최적화, 시간 복잡도 비교, 그리고 초보자가 흔히 저지르는 실수에 대해 다룹니다.

  • 🔢 정의 규칙: 소수란 1보다 큰 자연수 중에서 약수가 1과 자기 자신, 이렇게 두 개뿐인 수를 말합니다.
  • 🔁 반복 논리: 후보 값을 2부터 해당 값의 절반까지의 모든 정수로 나누고 나머지가 0인지 여부를 기록합니다.
  • 🚩 깃발 무늬: 불리언 변수에 결과가 저장되고, break 문은 약수가 발견되는 순간 루프를 종료합니다.
  • 제곱근 최적화: 제곱근까지의 약수만 검사하면 결과는 변하지 않으면서 반복 횟수가 n/2에서 √n으로 줄어듭니다.
  • ⚠️ 엣지 케이스: 0, 1, 그리고 음수는 절대 소수가 아니며, 2는 유일한 짝수 소수입니다.
  • ⏱️ 복잡성 비교: 기본 반복문은 O(n) 시간 복잡도로 실행되고 제곱근 방법은 O(√n) 시간 복잡도로 실행됩니다.
  • 🧪 검증 실습: 1, 2, 9, 17, 97을 사용하여 테스트하여 모든 경계 조건을 확인하십시오.

Java 소수 확인 프로그램

소수란 무엇입니까?

소수란 1보다 큰 자연수 중에서 1 또는 자기 자신으로만 나누어지는 수를 말합니다. 예를 들어, 11은 1 또는 자기 자신으로만 나누어집니다. 다른 소수로는 2, 3, 5, 7, 11, 13, 17 등이 있으며, 이 수열은 끝없이 이어집니다.

1보다 크고 소수가 아닌 수를 합성수라고 합니다. 합성수는 자신보다 작은 약수로 나눌 수 있기 때문입니다. 9는 3으로 나누어 떨어지므로 합성수이고, 15는 3과 ​​5로 나누어 떨어지므로 합성수입니다.

참고 : 0과 1은 소수가 아닙니다. 2는 유일한 짝수 소수이며, 음수는 절대 소수로 간주되지 않습니다.

어떤 숫자가 소수인지 확인하는 방법 Java

검증 전략은 간단한 나눗셈 테스트입니다. 후보 값을 가져와서 각각 더 작은 정수로 차례로 나누고 나머지를 확인합니다. 나머지가 0이면 약수가 존재함을 증명하는 것이므로 해당 숫자는 즉시 부적합합니다.

프로그램 논리:

  • 주어진 숫자(예: 17)를 2부터 17까지의 값으로 나누고 나머지를 확인해야 합니다. 나머지가 0이면 그 숫자는 소수가 아닙니다.
  • 어떤 숫자도 자신의 절반 이상으로 나누어지지 않습니다. 그래서 우리는 고리 그냥 통해 numberToCheck/2입력값이 17이면 절반은 8.5이고, 반복문은 2부터 8까지의 값을 순회합니다.
  • numberToCheck가 다른 수로 완전히 나누어떨어지면 isPrime 플래그가 설정됩니다. false 루프가 종료됩니다.

두 Java 특징들이 전체 알고리즘을 구성합니다. 모듈러스 연산자 % 정수 나눗셈의 나머지를 반환합니다. break 해당 구문은 답을 알게 되는 즉시 루프를 중지하므로 불필요한 반복이 실행되지 않습니다.

Java 숫자가 소수인지 아닌지 확인하는 프로그램

아래 프로그램은 numberToCheck 변수에 17이라는 값을 할당하고 나눗셈 과정을 단계별로 출력하여 계산 과정을 따라갈 수 있도록 합니다. 코드는 수정 가능하므로, 값을 변경하고 21과 같은 합성수를 넣어 다시 실행하면 반대 결과가 나오는 것을 확인할 수 있습니다.

public class PrimenumberToCheckCheck {

 public static void main(String[] args) {
  int remainder;
  boolean isPrime=true;
  int numberToCheck=17; // Enter the number you want to check for prime

  //Loop to check whether the number is divisible by any number other than 1 and itself
  for(int i=2;i<=numberToCheck/2;i++)
  {
   //number is divided by i
            remainder=numberToCheck%i;
            System.out.println(numberToCheck+" Divided by "+ i + " gives a remainder "+remainder);

       //if remainder is 0 then the number is not prime and we break the loop. Else continue the loop
     if(remainder==0)
     {
        isPrime=false;
        break;
     }
  }
  // Check value true or false, if isPrime is true then the number is prime otherwise not prime
  if(isPrime)
     System.out.println(numberToCheck + " is a Prime number");
  else
     System.out.println(numberToCheck + " is not a Prime number");
    }
  }

예상 출력 :

17 Divided by 2 gives a remainder 1
17 Divided by 3 gives a remainder 2
17 Divided by 4 gives a remainder 1
17 Divided by 5 gives a remainder 2
17 Divided by 6 gives a remainder 5
17 Divided by 7 gives a remainder 3
17 Divided by 8 gives a remainder 1
17 is a Prime number

17을 2로 나누면 정수 연산에서 8이 되므로 루프는 8에서 멈춥니다. 나머지가 0이 될 수 없으므로 isPrime 플래그는 초기값인 true를 유지하고 최종 조건은 긍정적인 결과를 출력합니다.

제곱근 방법을 이용한 최적화된 소수 판별

수의 절반까지 나누는 것은 맞지만 비효율적입니다. 어떤 수 n의 약수가 제곱근보다 크다면, 그에 상응하는 공동 약수는 제곱근보다 작아야 하므로 이미 발견되었을 것입니다. 따라서 √n까지 확인하는 것이 훨씬 적은 반복 횟수로 동일한 답을 얻을 수 있습니다.

public class PrimeCheckOptimized {

    public static boolean isPrime(int n) {
        // 0, 1 and negative values are never prime
        if (n <= 1) {
            return false;
        }
        // 2 is the only even prime number
        if (n == 2) {
            return true;
        }
        if (n % 2 == 0) {
            return false;
        }
        // test only odd divisors up to the square root
        for (int i = 3; i * i <= n; i += 2) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        int[] samples = {1, 2, 9, 17, 97};
        for (int value : samples) {
            System.out.println(value + " is prime: " + isPrime(value));
        }
    }
}

출력:

1 is prime: false
2 is prime: true
9 is prime: false
17 is prime: true
97 is prime: true

조건 i * i <= n 이 방법은 Math.sqrt에 대한 부동 소수점 호출을 피하고, 2씩 증가시켜 짝수 약수를 건너뜁니다. 1,000,003과 같은 값의 경우 기본 루프는 약 500,000번의 반복을 수행하는 반면, 이 버전은 500번 미만의 반복을 수행합니다.

사용자가 입력한 소수를 확인합니다

하드코딩된 입력은 데모에는 편리하지만, 실제 문제에서는 대개 키보드 입력이 필요합니다. Scanner 클래스는 콘솔에서 정수를 읽어 isPrime 메서드에 전달합니다.

import java.util.Scanner;

public class PrimeCheckUserInput {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter a number: ");
        int number = sc.nextInt();

        boolean isPrime = number > 1;
        for (int i = 2; i * i <= number; i++) {
            if (number % i == 0) {
                isPrime = false;
                break;
            }
        }

        System.out.println(number + (isPrime ? " is a Prime number" : " is not a Prime number"));
        sc.close();
    }
}

샘플 실행:

Enter a number: 29
29 is a Prime number

💡 팁: 플래그를 초기화합니다 number > 1 0, 1 및 모든 음수 입력값을 단일 표현식으로 처리하므로 별도의 가드 절이 필요하지 않습니다.

소수 찾기 프로그램을 작성할 때 흔히 저지르는 실수

대부분의 잘못된 제출물은 메인 루프보다는 경계값에서 오류가 발생합니다. 아래 목록은 초보자 코드에서 가장 자주 나타나는 오류들을 다룹니다.

  1. 루프를 1부터 시작합니다: 모든 정수는 1로 나누어 떨어지므로 플래그는 즉시 false로 설정되고 프로그램은 어떤 숫자도 소수가 아니라고 보고합니다.
  2. 1을 소수로 취급하는 경우: 값 1은 약수가 하나뿐이므로 약수가 두 개라는 조건을 만족하지 못하므로 false를 반환해야 합니다.
  3. break 문을 생략하면 다음과 같습니다. 프로그램은 여전히 ​​정답을 반환하지만, 결과가 나온 후에도 계속 반복 실행되어 입력값이 클 경우 시간이 낭비됩니다.
  4. 사용 i <= n 경계선으로서: 이 숫자는 항상 자기 자신을 나누므로, 반복문은 n에 도달하기 전에 멈춰야 합니다.
  5. 비교 = 대신 ==: 등호 하나만 사용하면 값을 테스트하는 대신 값을 할당하게 되어 if 조건문에서 컴파일 오류가 발생합니다.

주요 검증 방법 비교

입력값의 크기와 단일 값 또는 전체 범위 테스트 여부에 따라 적절한 방법을 선택하십시오.

방법 제수 범위 테스트 완료 시간 복잡성 최고의 적합 대상
기본 루프 2에서 n-1까지 O (N) 핵심 논리 학습
절반 분할 2에서 n/2까지 O (N) 적은 입력, 간단한 코드
제곱근 방법 2에서 √n까지 O(√n) 단일 큰 값
에라토스테네스의 체 미리 계산된 테이블 O(n log log n) 범위 내의 모든 소수를 나열합니다.

단일 값이 아닌 전체 범위를 분류해야 할 때는 체가 훨씬 더 효율적입니다. 저희의 보조 프로그램은 이러한 분류 체계를 찾는 데 도움을 드립니다. 청춘 Numbers 1에서 100에 해당 패턴을 보여줍니다. 관련 루프 기반 연습 문제는 다음을 참조하십시오. 피보나치 수열 Java 밸리 Java 회문 프로그램Bubble 정렬 알고리즘 Java깃발 선언과 카운터 입력 방법을 다시 한번 확인하고 싶은 초보자분들은 다음 내용을 읽어보세요. Java 변수 메인에 Java 지도 시간.

자주 묻는 질문

아니요. 숫자 1은 약수가 하나뿐이므로 약수가 두 개라는 조건을 만족하지 않습니다. 올바른 프로그램이라면 1, 0, 그리고 모든 음의 정수에 대해 false를 반환해야 합니다.

약수는 항상 쌍으로 나타납니다. 제곱근보다 큰 약수가 존재한다면, 그 쌍을 이루는 약수는 제곱근보다 작고 이미 검증되었으므로 추가적인 검사가 필요하지 않습니다.

네. 매개변수 유형을 int에서 long으로 변경하고 동일한 로직을 유지하세요. 64비트를 초과하는 값의 경우, 시행착오 대신 BigInteger와 isProbablePrime 메서드를 사용하세요.

네. 루프 시작 전에 카운터를 선언하고, while 문 헤더에 동일한 조건을 넣은 다음, 본문 안에서 카운터를 증가시키면 됩니다. 출력 결과는 동일합니다.

일반적으로는 그렇지만, 생성된 코드는 0, 1, 그리고 음수 입력에 대한 보호 처리를 생략하는 경우가 많습니다. AI가 작성한 구현을 수용하기 전에 항상 직접 경계 조건 테스트를 실행해 보세요.

소수는 해시 함수, 난수 생성, 그리고 모델 API와 저장된 데이터 세트를 보호하는 RSA 암호화의 기본 원리입니다. 해시 테이블 크기는 키를 고르게 분산시키기 위해 소수로 선택되는 경우가 많습니다.

이 게시물을 요약하면 다음과 같습니다.