약수가 1 그리고 자기 자신밖에 없는 수
1. N/2까지 확인하는 방법
[N/2 값까지 나누어 떨어지는 확인하는 방법]
boolean prime(int n){
if(n < 2){
return false;
}
for (int i =2; i<=n/2; i++){
if(n %i == 0){
return false;
}
}
return true;
}
2. √n까지 확인하는 방법
[ √n 값까지 나누어 떨어지는지 확인하는 방법]
boolean prime(int n){
if(n < 2){
return false;
}
for (int i =2; i*i<=n; i++){
// i*i는 √n의 범위를 정수의 표현으로 바꾸어 표현하기 위해 사용
// √같은 실수보다 정수로 표현해 코드를 작성하는것을 추천한다.
if(n %i == 0){
return false;
}
}
return true;
}
위에서 사용한 방법으로 1부터 N까지 모든 소수를 구하는데 걸리는 시간복잡도는 O(N√N)이 걸린다. 따라서, 1부터 N까지 범위 안에 들어가는 모든 소수를 구하려면 에라토스테네스의 체라는 방법을 사용한다.
[에라토스테네스의 체를 이용해 100이하의 모든 소수를 찾는 방법]
2의 배수인 빨간색으로 표시된 숫자를 모두 지운다.
3의 배수인 빨간색으로 표시된 숫자를 모두 지운다.
이렇게 2,3,5,7까지 배수를 모두 지우면 그 이후의 숫자들의 배수는 이미 지워져있기 때문에 더이상 수행할 필요가 없다. 즉, 남아있는 모든 수가 소수이다.
[에라토스테네스의 체 구현]
int prime[100]; // 소수 저장
int primeNumber = 0; // 소수의 개수
boolean checkPrimeNumber[101]; // 지워졌으면 true
int n = 100; // 100까지 소수
for (int i = 2; i <= n; i++) {
if (!checkPrimeNumber[i]) {
prime[primeNumber++] = i;
for (int j = i * i; j <= n; j += i) {
checkPrimeNumber[j] = true;
}
}
}
for
문은 N까지 반복한다.for
문 j
는 N의 크기에 따라 i * i
또는 i * 2
로 바꾸는 것이 좋다.i
가 백만일 경우 i * i
는 범위를 넘어가기 때문이다.