사이트 이름 - 문제 7번
소수를 크기 순으로 나열하면 2, 3, 5, 7, 11, 13, ... 과 같이 됩니다. 이 때 10,001번째의 소수를 구하세요.
해결방법
이건 일전에 소수 구하는 함수를 이용해서 풀면 되겠다.
하도 느려서 소수 구하는 알고리즘을 다시 만들었다.
def is_prime(number):
if number < 2:
return False
if number == 2:
return True
if number % 2 == 0:
return False
for i in range(3, int(number ** 0.5) + 1):
if number % i == 0:
return False
return True
i = 2
cnt = 0 # 10001 번째 소수를 찾기위해 카운트
while True:
if is_prime(i):
cnt += 1
if cnt == 10001:
break
i += 1
print(i) # 104743
에라토스테네스의 체(The sieve of Eratosthenes)
이 문제를 풀기위해 프로젝트 오일러에서 제공하는 해법
주어진 자연수 n까지의 모든 소수를 찾는 고대의 알고리즘이다. 첫 소수인 2부터 시작해서 각 소수의 배수가 되는 합성수를 제거하는 방법을 반복하여 모든 소수를 걸러낸다. 작은 범위에서 모든 소수를 찾아내는 가장 효율적인 방법 중 하나이다.
알고리즘
- 2부터 까지의 모든 자연수의 목록을 만든다: (2, 3, 4, ..., n).
- 초기 상태에 변수 값으로 최소 소수인 2를 대입한다.
- 2p에서 까지 모든 의 배수를 목록에서 찾아 제거 표시한다: (2p, 3p, 4p, ...; p는 제외).
- p보다 큰 수 중에서 제거 표시가 안 된 가장 작은 수를 찾는다. 그런 수가 없다면 종료하고, 있다면 그 수를 에 대입하고 3번부터 다시 반복한다.
- 알고리즘이 종료할 때, 목록에서 제거 표시가 되지 않고 남아 있는 수들이 까지의 모든 소수이다.
에라토스테네스의 체는 소수의 개수를 세는 데도 사용될 수 있다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
a + b + c = 1000 이 되는 피타고라스 수 (0) | 2021.01.29 |
---|---|
1000자리 수 안에서 이어지는 5개 숫자의 곱 중 최댓값은? (0) | 2021.01.28 |
1부터 100까지 "제곱의 합"과 "합의 제곱"의 차는? (0) | 2021.01.26 |
소수 구하기 (0) | 2021.01.25 |
1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수 (0) | 2021.01.25 |