BOJ 백준 1929 : 소수 구하기
Updated:
시작하면서
이번 문제는 소수 구하기 문제이다.
문제 이해
해당 문제는 소수를 구하는 알고리즘인 에라토스테네스의 체를 사용해서 해결하는 문제이다. 최대 숫자 N까지의 소수를 구하는 알고리즘 순서는 다음과 같다.
- 2부터 소수를 구하고자 하는 구간의 모든 수의 범위를 배열로 만든다.
- 2는 소수이므로 true 값을 넣어준다.
- 자기 자신을 제외한 2의 배수를 모두 false 값을 넣어준다.
- 자기 자신을 제외한 3의 배수를 모두 false 값을 넣어준다.
- 3/4번을 숫자 2,3,…,sqrt(N)의 범위까지 반복한다. (sqrt(N) 포함)
- 배열의 값이 true인 숫자들만이 소수이다.
5번에서 sqrt(N)까지만 하는 이유는 수학자들이 증명했는데, 단순히 생각해보아도 3^2 = 9의 배수들은 3으로 이미 나누었으니 두 번 계산할 필요가 없고, 5^2 = 25의 배수들은 이미 5로 나누었으니 두 번 계산할 필요가 없으므로 루트로 범위를 좁혀서 계산량을 줄인다.
해결
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
void MakePrimeNumberVector(vector<bool>& v, int N)
{
int length = sqrt(N);
v[0] = false;
v[1] = false;
for (int i = 2; i <= length; i++)
{
for (int j = i + i; j <= N; j += i)
{
v[j] = false;
}
}
}
int main()
{
// sync off
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// sync off
vector<bool> v;
int N, M;
cin >> M >> N;
v.resize(N + 1, true);
MakePrimeNumberVector(v, N);
for (int i = M; i <= N; i++)
{
if (v[i] == true)
{
cout << i << "\n";
}
}
return 0;
}
마치며
잊을만하면 생각나는 소수 구하기 알고리즘!
Leave a comment