#include <iostream>
using namespace std;
// 입력한 n이 소수인지 판별
bool IsPrime(int n)
{
if (n <= 1)
{
return false;
}
// n = 2일때 반복문 조건에 맞지 않아 실행x
for (int i = 2; i < n; i++)
{
if (n % i == 0)
{
return false;// 0
}
}
return true; // 1
}
int main()
{
cout << IsPrime(16);
}

#include <iostream>
using namespace std;
void Seive(int n)
{
// 동적배열 생성
int * array = new int[n + 1];
// 값을 초기화
for(int i = 0; i <= n; i++)
{
array[i] = i;
}
// 소수 판별
for(int i = 2; i <= sqrt(n); i++)
{
for(int j = i * 2; j <= n; j += i)
{
array[j] = 0;
}
}
// 소수 출력 (0과 1은 소수가 아니다)
for(int i = 2; i <= n; i++)
{
if(array[i] != 0)
{
cout << array[i] << " ";
}
}
delete[] array;
}
int main()
{
Seive(16);
}
에라토스테네스의 체 방식은 소수의 배수들을 차례차례 제거해나가는 방식인데, 0과 1은 소수에 포함되지 않는다 & 0이나 1부터 시작하게 되면 안쪽 for문에서 j값의 조건이 이상해지고 결과값도 잘못되게 됨
-> i는 2부터 시작
n의 배수들 중에서 제곱근n보다 작은 수들의 곱은 n을 넘지 않는다
-> k * m = n
-> K 는 제곱근n이하의 값들 / m 은 제곱근n이상의 값들
ex) n = 36 / k * m = 36
-> k = 1,2,3,4,6 -> 제곱근 6 이하
-> m = 6,9,12,18,36 -> 제곱근 6 이상
-> 결국, k x m = n / m x k = n
-> 제곱근 6 이후로는 새로운 배수가 나오지 않는다
출력값 : 2 3 5 7 11 13
// 소수 판별
for(int i = 2; i <= sqrt(n); i++)
{
for(int j = i * 2; j <= n; j += i)
{
array[j] = 0;
}
}