unagi11
이국의 보조기억장치
unagi11
전체 방문자
오늘
어제
  • 전체 글 (35)
    • Technology (28)
      • Algorithm Theory (10)
      • Problem Solving (14)
      • Unreal (1)
      • Unity (1)
      • Cocos2d (0)
      • etc (2)
    • Develop (5)
      • Dungeon-Chess (0)
      • Past Projects (3)
      • etc (2)
    • Daily (2)

블로그 메뉴

  • 깃허브
  • 프로필

인기 글

최근 글

hELLO · Designed By 정상우.
unagi11

이국의 보조기억장치

Technology/Algorithm Theory

[Algorithm] Sieve of Eratosthenes

2022. 4. 9. 20:07

개요

에라토스테네스의 체는 다수의 소수들을 구할때 적합한 방법이다.
$O(MloglogM)$ 시간 복잡도로 M보다 작은 소수들을 구할 수 있다.
만약 단일 수의 소수 판별을 위해서는 해당수의 2부터 제곱근 사이에 인수가 존재하는지 테스트하는 방법을 사용할 수 있다.

코드

#include <cstdio>
#include <vector>

using namespace std;

// MAXIMUM보다 작은 소수들을 구해 반환하는 함수
vector<int> eratosthenes_prime(int MAXIMUM)
{
    // 소수를 판별하기 위한 배열
    // 배열 index와 안의 수를 똑같이 맞추기위해 MAXIMUM + 1개로 설정했음.
    bool isPrimeNumbers[MAXIMUM + 1];
    fill_n(isPrimeNumbers, MAXIMUM + 1, true);

    // 에라토스테네스의 채
    // 소수가 아닌 수를 isPrimeNumbers에서 false로 바꿔준다.
    for (int i = 2; i * i <= MAXIMUM; i++)            // i => 2부터 MAXIMUM의 제곱근까지
        if (isPrimeNumbers[i] == true)                // i가 소수라면
            for (int j = i * i; j <= MAXIMUM; j += i) // MAXIMUM보다 작은 i * (i + n)은 {n은 0이상}
                isPrimeNumbers[j] = false;            // 모두 소수가 아니다.

    // 소수로 선별된 수들을 골라 반환한다.
    vector<int> primeNumbers;
    for (int i = 2; i <= MAXIMUM; i++)
        if (isPrimeNumbers[i] == true)
            primeNumbers.push_back(i);

    return primeNumbers;
}

int main(int argc, char const *argv[])
{
    int maximum;
    scanf("%d", &maximum);

    vector<int> prime_nums = eratosthenes_prime(maximum);

    for (int i = 0; i < prime_nums.size(); i++)
        printf("%d, ", prime_nums[i]);

    return 0;
}
저작자표시 (새창열림)
    'Technology/Algorithm Theory' 카테고리의 다른 글
    • [Algorithm] Spanning Tree
    • [Algorithm] 최대 유량 문제
    • [Algorithm] 최대 이분 매칭 문제
    • [Algorithm] Backtracking
    unagi11
    unagi11
    개발하고 기록하자

    티스토리툴바