728x90
728x170
문제7: 10001번째의 소수
문제
소수를 크기 순으로 나열하면 2, 3, 5, 7, 11, 13, ... 과 같이 됩니다.
이 때 10,001번째의 소수를 구하세요.
문제 해결 방법
- 하나하나씩 계산하는 방식(브루트 포스 방식)으로 문제를 해결하였다.
- 2중
for
문을 사용하여1
부터N
까지 순회를 하면서 소수의 조건(나머지가 1과 그 자신인 수) 을 만족시키는 수가 발견될 경우count
의 값을1
씩 증가시켰다.count
의 값이NUM(10001)
이 되었을 때의 값을ans
변수에 할당하고, 2중for
문에서 빠져나오도록 하였다.
NUM(10001)
번째 소수가 담긴ans
변수의 값을 출력하도록 하였다.
- 2중
- 연산을 빠르게 하도록 하기 위해
register
변수를 사용하여for
문을 순회하도록 하였다.
소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream> using namespace std; #define N 100000000 #define NUM 10001 // NUM 번째 소수 int main() { int count_remainder = 0, count = 0; unsigned long long int ans; for (register int i = 1; i <= N; i++) { for (register int j = 1; j <= i; j++) { if (i % j == 0) { count_remainder++; } } if (count_remainder == 2) { count++; count_remainder = 0; } else { count_remainder = 0; } if (count == NUM) { ans = i; break; } } cout << ans << endl; return 0; } |
정답
104743 |
심화 공부
에라토스테네스의 체(The Sieve of Eratosthenes)
주어진 자연수 n까지의 모든 소수를 찾는 고대의 알고리즘이다. 첫 소수인 2부터 시작해서 각 소수의 배수가 되는 합성수를 제거하는 방법을 반복하여 모든 소수를 걸러낸다. 작은 범위에서 모든 소수를 찾아내는 가장 효율적인 방법 중 하나이다.
알고리즘
2부터 n까지의 모든 자연수의 목록을 만든다: (2, 3, 4, ..., n).
초기 상태에 변수 p 값으로 최소 소수인 2를 대입한다.
2p에서 n까지 모든 p의 배수를 목록에서 찾아 제거 표시한다: (2p, 3p, 4p, ...; p는 제외).
p보다 큰 수 중에서 제거 표시가 안 된 가장 작은 수를 찾는다. 그런 수가 없다면 종료하고, 있다면 그 수를 p에 대입하고 3번부터 다시 반복한다.
알고리즘이 종료할 때, 목록에서 제거 표시가 되지 않고 남아 있는 수들이 n까지의 모든 소수이다.
에라토스테네스의 체는 소수의 개수 를 세는 데도 사용될 수 있다.
728x90
그리드형(광고전용)
'Problem Solving > Project Euler' 카테고리의 다른 글
[Project Euler #11][C++] 20×20 격자에서 연속된 네 수의 곱 중 최댓값 (0) | 2020.12.26 |
---|---|
[Project Euler #10][C++]이백만 이하 소수의 합 (0) | 2020.12.24 |
[Project Euler #9][C++] a + b + c = 1000 이 되는 피타고라스 수 (0) | 2020.12.23 |
[Project Euler #8][C++] 1000자리 수 안에서 이어지는 5개 숫자의 곱 중 최댓값은? (0) | 2020.12.22 |
[Project Euler #6][C++] 1부터 100까지 "제곱의 합"과 "합의 제곱"의 차는? (0) | 2020.12.22 |
[Project Euler #5][C++] 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수 (0) | 2020.11.16 |
[Project Euler #4][C++] 세자리 수를 곱해 만들 수 있는 가장 큰 대칭수 (0) | 2020.11.15 |
[Project Euler #3][C++] 가장 큰 소인수 구하기 (0) | 2020.10.26 |