반응형
에라토스테네스의 체로 풀어봅시다.
에라토스테네스의 체
소수를 판별하는 알고리즘이다. 소수를 대량으로 빠르고 정확하게 구하는 방법이다.
단일 숫자 소수 여부 확인
어떤 수의 소수 여부를 확인할 때는 특정 숫자의 제곱근까지만 약수의 여부를 검증하면 O(N^1/2) 의 시간 복잡도로 빠르게 구할 수 있다. 만약, 대량의 소수를 한꺼번에 판별해야하는 경우는 "에라토스테네스의 체"를 사용한다.
에라토스테네스의 체 원리
에라토스테네스의 체는 가장 먼저 소수를 판별할 범위만큼 배열을 할당하여, 해당하는 값을 넣어주고, 이후에 하나씩 지워가는 방법을 이용한다.
- 배열을 생성해 초기화한다.
- 2부터 시작해서, 특정 수의 배수에 해당하는 수를 모두 지운다. ( 지울 때, 자기자신은 지우지 않고, 이미 지워진 수는 건너뛴다. )
- 2부터 시작해서 남아있는 수를 모두 건너뛴다.
에라토스테네스 체의 구현
N = int(input())
number = 1000
a = list(range(1, N+1))
def find_prime(N):
for i in range(2,N+1):
if a[i] ==0:
continue
else:
for k in range(2*i,N+1,i): # 자기 자신을 제외한 그 배수는 모두 지우기
a[k] =0
for i in range(2,N+1): # 소수 출력
if a[i] ==0:
continue
else:
print(a[i])
find_prime(N)
문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
M,N = map(int, input().split())
number = N
a = list(range(0, N+1))
def find_prime(M,N):
for i in range(2,N+1):
if a[i] ==0:
continue
else:
for k in range(2*i,N+1,i): # 자기 자신을 제외한 그 배수는 모두 지우기
# print(k)
a[k] =0
for i in range(M,N+1): # 소수 출력
if a[i] ==0 or i ==1:
continue
else:
print(a[i])
find_prime(M,N)
참고 문헌
반응형
'알고리즘' 카테고리의 다른 글
백준 9020번 골드바흐의 추측 파이썬 수학2 실버1 (0) | 2020.12.17 |
---|---|
백준 4948번 베르트랑 공준 파이썬 수학 실버2 (0) | 2020.12.17 |
백준 1780번 종이의 개수 파이썬 분할 정복 문제 실버 2 (0) | 2020.12.17 |
백준 1992번 쿼드 트리 파이썬 분할정복 실버 1 (0) | 2020.12.17 |
백준 11866번 요세푸스 문제 0 파이썬 실버 4 큐, 덱 (0) | 2020.12.16 |