ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 1929 :: 소수 구하기 (에라토스테네스의 체 구현)
    알고리즘/BOJ(C++) 2018. 6. 19. 22:59
    반응형
    https://www.acmicpc.net/problem/1929

    a와 b사이의 모든 소수를 구해서 출력하는 문제입니다.

    너무 뻘짓을 많이 해서 이것때매 정답률 엄청 낮아짐 ㅠㅠ속상하다


    소수를 구하는데 우리가 일반적으로 생각하는 그 평범한 포문을 쓰면 시간초과가 납니다(1부터 자기 자신 전까지의 수로 나눠지는지 아닌지 판단하는 과정)


    가장 효율적인 소수를 구하는 방법인 '에라토스테네스의 체'를 사용해야 합니다.


    이 방법은 큰 배열을 잡아놓고 2부터 n까지 자신의 배수를 지워나가는 방법입니다.


    이미 지워진 부분이라면 검사할 필요가 없고 지워지지 않았다면 자기 자신의 배수를 지워주면 됩니다.


    주의해야 할 점

    1. i*i가 n보다 작을 때 까지만 확인해야 합니다. 소수의 특성상 구하고자 하는 수의 루트값보다 작은 값은 소수가 될 수 없으니까요!

    2. 배수를 지워나갈 때 자기 자신은 지우면 안되고 자기 자신 *2부터 지워야 합니다. 예를들어 6은 소수가 아니지만 3은 소수이니까!

    3. 이 문제에서 endl을 많이 쓰게 되는데 이부분에서 시간이 엄청 걸린다고 합니다. 얘 때문에 시간초과 엄청 났네요 ㅠ 

    '/n'을 쓰거나 std::ios::sync_with_studio(false), 또는 cin.tie(NULL)이거 써주시면 됩니다.



    #include <iostream>
    #include <vector>
    using namespace std;
    int prime[1000001];
    bool check[1000001];
    int main()
    {
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    int m, n;
    cin >> m >> n;
    check[0] = true, check[1] = true;
    for (int i = 2; i*i <= n; i++)
    {
    if (check[i] == false)
    {
    for (int j = i * 2; j <= n; j += i)
    {
    check[j] = true;
    }
    }
    }
    for (int i = m; i<= n; i++)
    {
    if (check[i] == false)
    {
    cout << i << '\n';
    }
    }
    }


    반응형

    '알고리즘 > BOJ(C++)' 카테고리의 다른 글

    [BOJ] 11653 :: 소인수분해  (0) 2018.06.19
    [BOJ] 6588 :: 골드바흐의 추측  (0) 2018.06.19
    [BOJ] 11576 :: Base Conversion  (0) 2018.06.19
    [BOJ] 1373 :: 2진수 8진수  (0) 2018.06.19
    [BOJ] 2225 :: 합분해  (0) 2018.06.16

    댓글

Designed by Tistory.