
백준 1929번 문제입니다.
m,n = map(int, input().split())
for i in range(m,n+1):
if i==1:
continue
for j in range(2,int(i**0.5)+1):
if i%j==0: #약수가 존재함 -> 소수가 아님
break #더 이상 볼 필요 없음
else:
print(i)
이 문제는 문제만 읽었을 때는 간단하다. 주어진 범위 내의 수를 모두 돌면서 1을 제외하고 나누어 떨어지는 수가 있는지 없는지 확인하면 된다. 하지만 시간초과로 정답을 맞출 수 없다. 그래서 사용하는 방법이 에라토스테네스의 체(소수 구하기)이다.






if i ==1: continue
1은 소수가 될 수 없으므로 제외한다.
for j in range(2 ,int(i**0.5)+1)
: 2~제곱근 사이의 수로 나누어 떨어진다면 종료 -> 다음 수 확인
범위 내의 수의 제곱근을 구해, 그 제곱근과 같거나 작은 수로 나누어 떨어지면 제거할 수 있다. 특정 수의 약수들은 대칭하여 곱을 이루기 때문이다.
예를 들어 18의 약수는 1, 2, 3, 6, 9, 18이고 1*18, 2*9, 3*6으로 서로 대칭을 이룬다. 따라서 이런 경우에는 3까지만 확인하면 된다. (18의 제곱근은 18 ** 0.5 = 4.xx ... 이고, 이 제곱근보다 같거나 작은 수까지만 나눠보고 나누어 떨어지는게 있는지 없는지 확인하면 된다.)
else
나누어 떨어지지 않거나, for문이 끝난다면 else문에 해당 값 출력한다.