📄 소수 (Prime Number)
- 1과 자기자신을 제외하고 약수를 갖지 않는 1보다 큰 자연수
✏️ 시간복잡도 O(N)
- 1과 자기자신을 제외한 숫자로 다 나눠보는 방법
bool isPrime1(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
✏️ 시간복잡도 O(√N)
- 약수를 구할때, 해당 수의 제곱근을 중심으로 좌측에 있는 수들은 우측에있는 수와 짝을 이룬다.
- 2부터 제곱근까지의 수중, 해당 수와 나누어 떨어지는 수가 있는지 확인, 약수가 있다면 소수가 아니고, 없다면 소수가 된다.
- 81의 약수는 1, 3, 9, 27, 81
- 1은 81의 약수이다. 따라서 81/1 = 81 또한 81의 약수이다.
- 3은 81의 약수이다. 따라서 81/3 = 27 또한 81의 약수이다.
- 9는 81의 약수이다. 따라서 81/9 = 9 또한 81의 약수이다.
- 소수 판별을 해야할 data 수가 적을 때 효율적
bool isPrime2(int n) {
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
✏️ 시간복잡도 O(Nlog(logN))
- 에라토스테네스의 체
- 소수 판별을 해야할 data 수가 많을 때 효율적
bool isPrime3(int n) {
bool* IsPrime = new bool[n+1];
for (int i = 0; i <= n; i++) {
isPrime[i] = true;
}
}
for (int i = 2; i <= n; i++) {
if (isPrime[i]) {
cout << i << " ";
for (int j = i * 2; j <= n; j +=i) {
isPrime[j] = false;
}
}
}
}
자료 출처