코딩테스트 연습/Baekjoon

[Baekjoon] 1929번: 소수 구하기 (c++)

수기 2022. 3. 31. 19:55

https://www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

일반적인 2중 for문을 사용하면 시간초과가 나오는 문제였다.
넓은 범위의 소수 판별을 위하여 에라토스테네스의 체를 사용했다.

 


코드

//1929
#include <iostream>
using namespace std;
#define SIZE 1000000

int main(int argc, const char * argv[]) {

    int num[SIZE]={0,};
    int M,N;
    
    cin >> M >> N;
    
    for(int i=2;i<SIZE;i++)num[i] = 1; //모두 소수로 취급

    for(int i=2;i*i<=SIZE; i++){
        if(num[i]){ //소수인 것만
            for(int j=i*i;j<=SIZE;j+=i)num[j] = 0;
        }
    }
    for(int j=M;j<=N;j++){
        if(num[j] == 1) cout << j<< "\n";
    }
    return 0;
}