https://www.acmicpc.net/problem/4948
4948번: 베르트랑 공준
베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼
www.acmicpc.net
이 문제는 소수를 일일이 구한다면 제한된 시간내에 어렵다고 보면 된다.
그래서
'에라토스테네스의 체' 알고리즘이란,
2부터 소수를 구하고자 구간의 모든 수에서
2 * 2 , 2 * 3, 2 * 4 ,,,,
2부터 2곱한 수, 3곱한수를 지운다.
3도 마찬가지로, 3 * 2, 3 * 3, 3 * 4,,,
일정 구간까지 곱한 수의 배수를 지운다.
위 과정을 반복한다면 소수가 남는다.
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2
ko.wikipedia.org
- 수를 받는다
- 2부터 그 수의 제곱근까지
- 2부터 ~ 배수가 <= 2 * 그 수까지 (문제에서 2N수까지 소수를 구하라고 해서
- 배열[그 수의 배수] 자리에 -1를 넣는다.
- 받은 수부터 2N까지 -1이 아닌 수가 나오면 sum++
※ 이게 배열에 -1넣는 것의 중복을 피하기 위해,
이전 값이 어디까지 곱했는지 기억하고, 그 안의 수를 알고 싶을 땐 안 한 값만 하고싶었는데
틀렸다,, 근데 구현을 한다면 할 수 있을 것 같다.
소스코드↓
더보기
#include<stdio.h>
#include<math.h>
int main() {
int num;
int sum = 0;
int check[246913] = { -1,-1,1 };
while (1) {
scanf("%d", &num);
if (num == 0)
return 0;
for (int end_num = 2; end_num <= sqrt(2 * num); end_num++) {
for (int j = 2; end_num * j <= 2 * num; j++) {
check[end_num * j] =-1;
}
}
sum = 0;
for (int i = num+1; i <= 2 * num; i++) {
if (check[i] >-1)
sum++;
}
printf("%d\n", sum);
if(befor_num < num * 2)
befor_num = num * 2;
}
}
'Coding Test > Problem_solving' 카테고리의 다른 글
[백준] 9012_괄호 (0) | 2021.02.18 |
---|---|
[백준]9093_단어 뒤집기 (0) | 2021.02.18 |
[백준]1929_소수 구하기 (0) | 2021.02.13 |
[백준]2581_소수 (0) | 2021.02.12 |
[백준]1978_소수 찾기 (0) | 2021.02.12 |