알고리즘
소수 찾기 ( 에라토스테네스의 체 ) - JAVA
anycoding
2024. 9. 4. 16:17
반응형
에라토스테네스의 체 는 소수를 찾는 쉽고 빠르게 찾을 수 있는 방법이다.
( 고대 그리수 수학자 에라토스테네스가 발견 )
알고리즘
다음과 같은 알고리즘을 따른다.
0 ~ 50 까지의 수를 찾고자 할때, 0과 1을 제외
1. 2부터 시작하여 2를 제외한 2의 배수를 모두 지운다.
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 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
2. 지워지지 않은 다음 숫자부터 1번과 같이 반복한다. ( 3을 제외한 3의 배수 지우기 )
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 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
3. √50 = 7.071 이므로 구하는 수의 제곱근 이하의 소수, 즉, 7의 배수까지 제외하면 된다.
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 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
4. 제외 되지 않은 숫자가 소수
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47
Code
자바를 통해 다음과 같이 구현할 수 있다.
Boolean[] primeNumbers = new Boolean[number + 1]; // N이 0일 때, 0 ~ 100 까지 101개의 수
primeNumbers[0] = false; // 1
primeNumbers[1] = false; // 2
먼저 0 ~ 100까지의 101개의 배열을 생성해주고 0, 1은 제외 시킨다.
// 모두 true로 초기화
for (int i = 2; i <= number; i++) {
primeNumbers[i] = true;
}
2부터 모두 소수라 가정하고 true로 지정한다.
for (int i = 2; i <= Math.sqrt(number); i++) {
if (primeNumbers[i] == false)
continue;
for (int j = i + i; j <= number; j += i) {
primeNumbers[j] = false;
}
}
에라토스테네스의 체 공식으로
1. 이미 제외시킨 숫자라면 다음 숫자
2. 제외시킨 숫자가 아니라면 그 수를 제외하고 배수를 false로 변환한다.
다음과 같은 결과를 얻을 수 있다.
전체 코드
import java.util.Scanner;
public class eratos {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("2이상의 숫자를 입력해 주세요 : ");
int N = scanner.nextInt();
fintPrimeNumber(N);
}
private static void fintPrimeNumber(int number) {
Boolean[] primeNumbers = new Boolean[number + 1]; // N이 0일 때, 0 ~ 100 까지 101개의 수
primeNumbers[0] = false; // 1
primeNumbers[1] = false; // 2
// 모두 true로 초기화
for (int i = 2; i <= number; i++) {
primeNumbers[i] = true;
}
for (int i = 2; i <= Math.sqrt(number); i++) {
if (primeNumbers[i] == false)
continue;
for (int j = i + i; j <= number; j += i) {
primeNumbers[j] = false;
}
}
System.out.println();
System.out.println(number + "이하의 소수 입니다.");
for (int i = 0; i < primeNumbers.length; i++) {
if (primeNumbers[i]) {
System.out.print(i + " ");
}
}
}
}
반응형