에라토스테네스의 체 백준 1929번 문제 바로가기
백준 1929번 소수 구하기는 에라토스테네스의 체를 이용하여 주어진 범위 안의 소수를 구하는 문제이다.
문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
문제를 접하고 우선 에라토스테네스의 체에대한 이해가 필요했기에 구글링을 했다. 아래 이미지는 에라토스테네스의 체의 원리를 이해하기 쉽게 보여준다.
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
그림의 경우, {\displaystyle 11^{2}>120}
M, N = map(int, input().split())
def prime_list(n):
sieve = [True] * (n + 1)
m = int(n ** 0.5)
for i in range(2, m + 1):
if sieve[i] == True:
for j in range(i + i, n + 1, i):
sieve[j] = False
return [i for i in range(M, n + 1) if sieve[i] == True]
li = prime_list(N)
if 1 in li:
li.remove(1)
for k in li:
print(k)
else:
for _ in prime_list(N):
print(_)