오늘부턴 풀이도 같이 써보겠다.
우선, 소수를 구하는 방법은 이전 에라토스테네스의 체를 사용하겠습니다.
https://namu.wiki/w/에라토스테네스의%20체
에라토스테네스의 체에 대한 문서입니다. 참고하시면 되겠습니다
간단하게 요약하자면, 2~N까지의 수를 놓습니다. 그리고 여기서 지워지지 않은 수 중 가장 작은 수는 소수입니다. 그리고 그 소수의 배수를 모두 지웁니다, 이 과정을 반복하면 결과적으로 소수만 남게됩니다.
이전 문제에서 에라토스테네스의 체를 구현하여 소수 구하는 방법을 써놨으니 그 코드를 이용하면 됩니다.
범위만 정해주면 되는 문제이기때문에 사실상 문제의 핵심은 '에라토스테네스의 체'의 구현입니다.
#include <stdio.h>
int solve() {
int M = 1, N, res[1000000], cnt = 0;
while(M != 0) {
scanf("%d", &M);
N = 2 * M;
for(int i=0;i<=N;i++)
res[i] = i;
for(int i=2;i<=N;i++) {
if(res[i] == 0)
continue;
for(int j=i*2;j<=N;j+=i)
res[j] = 0;
}
for(int i=M;i<=N;i++) {
if(res[i] != 0 && res[i] != 1 && res[i] > M)
cnt++;
}
if(cnt != 0)
printf("%d\n", cnt);
cnt = 0;
}
}
int main() {
solve();
return 0;
}
'백준 (C99) > 기본수학 2단계 (完)' 카테고리의 다른 글
백준 1085 : 직사각형에서 탈출 (0) | 2022.02.01 |
---|---|
백준 9020 : 골드바흐의 추측 (0) | 2022.02.01 |
백준 11653 : 소인수분해 (0) | 2022.01.31 |
백준 2581 : 소수 (0) | 2022.01.31 |
백준 1978 : 소수 찾기 (0) | 2022.01.31 |
Comment