[C++] prime number. 소수 구하기: 에라토스테네스의 체

2022. 9. 22. 15:32·problem solving/개념 정리

소수 찾을 때 무식하게 반복문 걸리면 시간이 많이 걸린다는 사실은 이미 알겠죠? 

아무튼 효율적으로 풀기 위한 방법이 에라토스테네스의 체를 이용한 방법입니다.  외우기 힘든 이름이네요..

 

https://terms.naver.com/entry.naver?docId=3405213&cid=47324&categoryId=47324 

 

에라토스테네스의 체

에라토스테네스의 체(Eratosthenes’ sieve)는, 임의의 자연수에 대하여, 그 자연수 이하의 소수(prime number)를 모두 찾아 주는 방법이다. 입자의 크기가 서로 다른 가루들을 섞어 체에 거르면 특정 크

terms.naver.com

 

간단정리

 

1~100까지의 소수를 구해야 한다고 생각해봅시다. 

 

  1. 100에 루트를 씌우면 10입니다. 
  2. 1~10까지의 소수를 구해봅시다. 2, 3, 5, 7 입니다. 
  3. 2, 3, 5, 7의 배수를 100 이하까지 다 제거합니다.
  4. 남아있는 수가 소수입니다. 

 

#include <iostream>
#include <algorithm> // memset

int main()
{
    const int SIZE = 100;
    
    bool isPrime[SIZE+1];
    std::memset(isPrime, true, sizeof(isPrime));
    
    
    int N = SIZE;
    
    for (int i=2; i*i<=N; ++i)
    {
        for (int j = i*i; j<=N; j+=i)
            isPrime[j] = false;
    }
    
    
    for(int i=1; i<N; ++i)
    {
        if(isPrime[i])
            std::cout << i <<' ';
    }
    
    return 0;
}

 

 

근데 나는 배열로 메모리 차지하고 싶지않다?  

 

에라토스테네스의 체에서 제곱근을 이용해 반복 횟수를 줄일 수 있다는 점을 알게 됐습니다. 

그 점을 이용해 봅시다.

 

N: 100 -> sqrt(N): 10

 

100을 2~10까지 나눠봅시다. 나머지가 0인게 있나요? 있다면 소수가 아닙니다. 

소수는 1과 자기자신을 제외하고 나눠지지 않는 숫자를 뜻하니까요^^...

 

#include <iostream>
#include <cmath>

bool isPrime(int n)
{
    if (n == 1)
        return false;
    
    int tmp = std::sqrt(n);
    for (int i=2; i<=tmp; ++i)
    {
        if (n % i == 0)
            return false;
    }
    
    return true;
}

int main()
{
    int N;

    std::cin >> N;
    std::cout << (isPrime(N) ? "YES" : "NO");
    
    return 0;
}

 

 

이해가 안 간다면 제가 잘못 썼겠죠.  댓글 주세요.

저작자표시 비영리 변경금지 (새창열림)
'problem solving/개념 정리' 카테고리의 다른 글
  • [C++] 진수 변경: 숫자N을 A진법으로 바꿔보기
  • 원형 큐(Circular Queue) in C++
u1qns
u1qns
그냥 알고리즘 풀이만 올리려고 했는데, 정보 찾다보니까 너무 답답해서 이것저것 쓰다보니 커졌어요.
  • u1qns
    블로그
    u1qns
  • 전체
    오늘
    어제
    • 분류 전체보기 (171)
      • 회고 (1)
      • programming (17)
        • 개념 정리 (6)
        • CI CD (1)
        • 트러블 슈팅 (0)
        • 환경설정 및 팁 (7)
      • problem solving (153)
        • 개념 정리 (3)
        • 백준 (127)
        • SWEA (15)
        • 프로그래머스 (4)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SSAFY수료식
    미해결
    완전탐색
    POW
    백준
    DP
    BFS
    C++
    SWEA
    cpp
    삼성청년SW아카데미
    구현
    DFS
    되추적
    boj
    cmath
    SSAFY
    투포인터
    HELLOSSAFY
    그리디
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
u1qns
[C++] prime number. 소수 구하기: 에라토스테네스의 체
상단으로

티스토리툴바