190209 백준 알고리즘 문제풀기*
09 Feb 2019 | baekjoon[1929] 소수 구하기*
문제
- M이상 N이하의 소수를 모두 출력하는 프로그램을 작성
-
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어짐 (1 ≤ M ≤ N ≤ 1,000,000)
- 기존의 함수를 이용해서 문제를 풀었으나 시간초과가 발생했다.
- 에라토스테네스의 체를 이용
- 무식하게 배수들을 지워나가는 방식이지만, 그만큼 빠르게 작동 할 수
- 만약 어떤 수 $m=ab$라면, $a$와 $b$중 적어도 하나는 $\sqrt{n}$이하이므로, $n$보다 작은 합성수 $m$은 $\sqrt{n}$보다 작은 수의 배수만 체크해도 전부 걸러질 수 있음. 따라서 $\sqrt{n}$이하의 수의 배수만 지우면 됨.
정답
import sys
import math
def isprimenum(num):
if num <= 1:
return 0
for j in range(2, int(math.sqrt(num))+1):
if num/j == 1:
break
if num%j == 0:
return 0
return 1
nums = list(map(int, sys.stdin.readline().split()))
for j in range(nums[0], nums[1]+1):
if isprimenum(j)==1:
print(j)