less than 1 minute read

[BOJ/백준] 1929번 : 소수 구하기

BOJ 1747

Alt text

Alt text

문제 해석

  • 두 숫자 사이에 소수를 출력하는 문제이다. 에라토스테네스의 체를 사용하면 금방 풀리는 문제이다.

에라토스테네스의 체

풀이

  • 크기가 N+1인 배열을 선언한 후 값은 각각 인덱스로 채운다.
  • 1은 소수가 아니므로 2부터 시작, 2부터 N 제곱근까지 탐색한다. 값이 인덱스이면 그대로 두고 , 그 값의 배수를 탐색해 0으로 변경시킨다.
  • 남아있는 수 중에서 M이상 N이하의 수를 출력한다.

코드

#include <iostream>
#include <vector>
using namespace std;

int main(void){
    int M, N;
    cin>>M>>N;

    vector<bool> isPrime(N+1, true);
    isPrime[0] = isPrime[1] = false;

    for(int i=2; i*i<=N; ++i){//제곱근까지만 탐색 i<=sqrt(N); 해도됨
        if(isPrime[i]){
            for(int j=i*i; j<N+1; j+=i){
                if(j%i==0){//배수이면
                    isPrime[j]=false;//false(소수 아님을 의미)
                }
            }
        }
    }

    for(int i=M; i<=N; ++i){
        if(isPrime[i]){//true만 출력 (true == 소수)
            cout<<i<<'\n';
        }
    }
}