https://www.acmicpc.net/problem/4948
문제
베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다.
이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다.
예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23)
n이 주어졌을 때, n보다 크고, 2n보다 작거나 같은 소수의 개수를 구하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 케이스는 n을 포함하며, 한 줄로 이루어져 있다. (n ≤ 123456)
입력의 마지막에는 0이 주어진다.
출력
각 테스트 케이스에 대해서, n보다 크고, 2n보다 작거나 같은 소수의 개수를 출력한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include <stdio.h> #define MAX 246913 int main() { int N; int op; int prime_number[MAX] = { 0 }; int arr[123456]; long long i, j, k=0; for (i = 2; i<= MAX; i++) { if (!prime_number[i]) { arr[k++] = i; for (j = i *i; j <= MAX; j += i) { prime_number[j] = 1; } } } while (1) { scanf("%d", &op); if (op == 0) break; else { int cnt = 0; for (i=0;i<k;i++) { if (arr[i] > op) { if (arr[i] <= op * 2) cnt++; else break; } } printf("%d\n", cnt); } } } | cs |
에라토스테네스의체를 이용하여 int 배열을 만들어넣고 false 값을 넣어놓음 이후 소수의값만 배열에 넣어놓음 나중에 판별시에 조금이라도 빠르게하기위해
( 모두소수라고 판별해놓는다 원래 true 넣어놔야 모두 소수로 판별하고 하는건데 시간줄이려고 false로함)
그이후 소수로 판별된 배열값의 그 값만큼 배수를 모두 소수가 아닌것으로 바꿔놓고 이후 와일문에서 소수값만 넣어놓은 배열에서 cnt 한다.
에라토스테네스란 ??
출처 위키백과
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
그림의 경우, 이므로 11보다 작은 수의 배수들만 지워도 충분하다. 즉, 120보다 작거나 같은 수 가운데 2, 3, 5, 7의 배수를 지우고 남는 수는 모두 소수이다.
'백준 알고리즘' 카테고리의 다른 글
[C언어] 백준알고리즘 10815번 숫자 카드 문제 (0) | 2019.03.16 |
---|---|
[C언어] 백준알고리즘 2231번 분해합 문제 (0) | 2019.03.16 |
[C언어] 백준알고리즘 1065번 한수 문제 (0) | 2019.03.06 |
[C언어] 백준알고리즘 2439번 별찍기 -2 문제 (0) | 2019.03.03 |
[C언어] 백준알고리즘 2438번 별찍기 -1 문제 (0) | 2019.03.03 |