에라토스네스의 체란?
수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다.

- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
void SoE(const int n, const int m)
{
int pn = 0; // 소수의 개수
vector<int> prime; // 소수 저장
vector<bool> check = vector<bool>(n + 1, false); // 소수 확인
for (long long ii = 2; ii <= n; ii++)
{
if (check.at(ii) == false)
{
pn++;
prime.push_back(ii);
for (long long jj = ii * ii; jj <= n; jj += ii)
check[jj] = true;
}
}
}구현
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main()
{
int N,limit;
cin>>N;
vector<bool> arr(N+1);
fill(arr.begin(),arr.end(),true);
limit=sqrt(N);
for(int i=2; i<limit+1; i++)
{
if(arr[i]==true)
{
for(int j=i*i; j<N+1; j+=i)
{
arr[j]=false;
}
}
}
for(int i=2; i<N+1; i++)
{
if(arr[i]==true)
{
cout<<i<<", ";
}
}
return 0;
}limit가 인 이유
N이 100이라고 가정했을시, 100의 루트인 10의 배수에 100이 있기에 그 이상의 값은 확인하지 않아도 되기 때문