백준 단계별로 풀어보기 [기본수학 2] 베르트랑 공준
https://www.acmicpc.net/problem/4948
[풀이]
이전에 했던 소수 판정식을 이용해서 풀면 시간초과가 나온다. 따라서 에라토스테네스의 체라는 소수판별에 최적화된 알고리즘을 이용하여 풀어야 했다. 에라토스테네스의 체는 소수를 판별할 범위까지 배열을 만든 다음, 특정 수의 배수에 해당하는 수를 계속 지워나가는 방법이다. 이때 자기자신은 제외하고 이미 지워진 수는 건너뛴다.
[코드]
#include <iostream>
int main() {
int n, count;
int arr[300000];
while (true) {
int count = 0;
std::cin >> n;
if (n == 0) break;
for (int i = 0; i <= 2 * n; i++) {
arr[i] = 1;
}
//에라토스테네스의 체
for (int i = 2; i <= 2 * n; i++) {
if (arr[i] == 0) continue;
for (int j = 2 * i; j <= 2 * n; j += i) {
arr[j] = 0;
}
}
for (int i = n + 1; i <= 2 * n; i++) {
if (arr[i] != 0)
count++;
}
std::cout << count << std::endl;
}
return 0;
}
'알고리즘 공부 및 문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[c++] 백준 7568 덩치 (0) | 2021.07.12 |
---|---|
[c++] 백준 1085 직사각형에서 탈출 (0) | 2021.07.12 |
[c++] 백준 2581 소수 (0) | 2021.07.09 |
[c++] 백준 1712 손익분기점 (0) | 2021.07.09 |
[c++] 백준 10872 팩토리얼 (0) | 2021.07.09 |