https://www.acmicpc.net/problem/1929
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
아래와 같이 단순한 반복문으로 소수 구하기를 실행한다면, n-m 이 백만일 때 O(n^2)로 시간초과가 날 것이다.
def isPrime(n):
for i in range(2, n):
if n % 2 == 0:
print("소수가 아닙니다")
return
print("소수 입니다")
이럴때는 에라토스테네스의 체를 이용하여 빠르게 소수를 구할 수 있다.
임의의 자연수 n이 있으면 그 이하의 소수들을 전부 찾아내는 데 있어서 최적화된 알고리즘이라고 할 수 있다.
import math
m, n = map(int, input().split())
isPrime = [1 for _ in range(n+1)]
isPrime[0], isPrime[1] = 0, 0
length = int(math.sqrt(n))
for i in range(2, length+1):
if isPrime[i]:
for j in range(i*2, n+1, i):
isPrime[j] = 0
for i in range(m, n+1):
if isPrime[i]:
print(i)