| 문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
| 입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
| 출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
| 예제 입력 1
3 16
| 예제 출력 1
3
5
7
11
13
| 문제의 키 포인트
1. 에라토스테네스의 체로 풀이할 것.
알고리즘
1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
3. 자기 자신을 제외한 2의 배수를 모두 지운다.
4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
5. 자기 자신을 제외한 3의 배수를 모두 지운다.
6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
7. 자기 자신을 제외한 5의 배수를 모두 지운다.
8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
9. 자기 자신을 제외한 7의 배수를 모두 지운다.
10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
그림의 경우, 112 > 120 이므로 11보다 작은 수의 배수들만 지워도 충분하다. 즉, 120보다 작거나 같은 수 가운데 2, 3, 5, 7의 배수를 지우고 남는 수는 모두 소수이다.
| 해결방안(Solution)
1. 위 알고리즘을 바탕으로, 먼저 배열을 만들어 모든 수를 소수라 판단한다.
> 소수: 0, 소수가 아닌 수: 1
2. 이제 반복문을 통해 자기 자신을 제외한 배수는 소수가 아닌 수로 분류한다.
> 배열값을 0 --> 1로 변경
3. 입력한 범위에서의 소수값들을 출력한다.
| 소스코드(SourceCode)
// BOJ_1929_Search_decimal, 소수 구하기, 0: 소수, 1: 소수가 아닌 수
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define size 1000001
int main(void)
{
int M, N, i, j;
int arr[size] = { 0, }; // 모두 소수로 지정
scanf("%d %d", &M, &N);
arr[0] = 1, arr[1] = 1; // 0과 1은 소수 x
for (i = 2; i <= N; i++)
{
if (arr[i] == 1) // 이미 소수가 아닌 수는 넘어가기
{
continue;
}
else
{
for (j = 2; i * j <= N; j++) // 자신을 제외한 배수는 소수 x
{
arr[i * j] = 1;
}
}
}
for (i = M; i <= N; i++) // 주어진 범위에서 소수값 출력
{
if (arr[i] == 0)
{
printf("%d\n", i);
}
}
return 0;
}
알고리즘을 이해한다면, 그렇게 어려운 문제는 아니었네요.
그럼 오늘도 즐거운 코딩!
| 문제출처
https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
'코딩 | 알고리즘 & 문제풀이 > 백준_Backjoon' 카테고리의 다른 글
[C언어] Backjoon_Code 9020, 골드바흐의 추측 (0) | 2021.07.28 |
---|---|
[C언어] Backjoon_Code 4948, 베르트랑 공준 (0) | 2021.07.27 |
[C언어] Backjoon_Code 11653, 소인수분해 (0) | 2021.07.25 |
[C언어] Backjoon_Code 2581, 소수 (0) | 2021.07.24 |
[C언어] Backjoon_Code 1978, 소수찾기 (0) | 2021.07.23 |