C++ 소수 찾기, 검사하기 [에라토스테네스의 체] 하는 방법
소수 찾는 알고리즘 [에라토스테네스의 체]
- 2부터 지정한 수까지의 소수들을 찾을 수 있다.
- i(=2)부터 ~ 지정한 수의 제곱근까지 수들의 배수들을 제외하는 과정을 반복하면서 소수를 판별한다.
( 어느 수의 배수라는 것은 소수가 아니라는 의미)
-> 참조
[ 코 드 ]
#include <iostream>
#include <math.h>
#define N 500
#define N2 199
using namespace std;
bool sosu(int n) {
int k = (int)sqrt(n);
for (int i = 2; i <= k; i++) {
if (n % i == 0) return false;
}
return true;
}
int main() {
bool* b = new bool[N + 1]; // 숫자 A을 배열의 A번에 저장하기 위하여 크기 N+1
for (int i = 2; i < N+1; i++) b[i] = true;
for (int i = 2; i * i < N+1; i++) {
for (int k = i * i; k < N+1; k += i) {
b[k] = false;
}
}
// 결과
cout << N << "까지의 소수들\n";
for (int i = 2; i < N + 1; i++) if (b[i]) cout << i << ", ";
cout << "\n\n" << N2 << "는 ";
if (sosu(N2)) cout << "소수입니다.\n";
else cout << "소수가 아닙니다.\n";
return 0;
}
16~23 라인 : N+1만큼의 크기를 갖는 bool 배열을 선언하고 true로 초기화 해준다. 그리고 N까지 i의 배수들을 false로 바꾸는 과정을 반복한다.
7라인 : sosu함수는 인수로 받은 수가 소수인지 판별하여서 참이면 true를 거짓이면 false를 리턴한다.
8라인 : sqrt(n) 함수는 제곱근을 구하는 함수로서 #include <math.h> 를 해주어야 한다.
9라인 : for문을 보면 2부터 n의 제곱근인 k까지 검사한다. k까지만 검사해도 되는 이유는
ex) n = 16 일 때, k= 4
그러면 "4이전 i=2일 때 검사한 것 " = "4이후 i=8일 때 검사한 것"
즉, 2 x 8 = 8 x 2 이므로 제곱근인 k까지만 검사해주면 된다.
[ 결 과 ]
결과를 보면 2부터 500전까지의 소수들을 출력한다.
또한, 199가 소수인지 아닌지 판별한다.
'C++ > Algorithm' 카테고리의 다른 글
C++ string to int, int to string 형변환 하기 (0) | 2020.01.31 |
---|---|
C++ 제곱근 구하기, n승 값 구하기 : sqrt(), pow() (0) | 2020.01.30 |
C++ #include <bits/stdc++.h> 헤더 사용하기 (0) | 2020.01.28 |
C++ 최대공약수/최소공배수 - 유클리드 호제법 (0) | 2020.01.24 |
C++ 조합(Combination) 회귀를 이용 (2) | 2020.01.23 |