|
| 1 | +``` |
| 2 | +package algo; |
| 3 | +
|
| 4 | +
|
| 5 | +/** |
| 6 | + * 에라토스테네스의 체 - 소수 판별 |
| 7 | + * 1과 자기자신만을 약수로 갖는 수를 찾아라 |
| 8 | + * 생각 - |
| 9 | + * ex) 8이 소수인지 판별할때 사실 (int)8의 제곱근까지만 검사해보면된다 |
| 10 | + * 왜냐하면 8 = 2*4 =2*2*2 / 6 = 2*3 / ==> 결국 3,4까지 확인할 필요도 없이 2로 나눴을 때 나머지가 생기느냐 여부로 확인하면된다 |
| 11 | + * 예를들어 27이라면 27의 (int)sqrt(27) = 5 |
| 12 | + * 27 = 3*9 = 3*3*3 3의 배수까지 거칠필요없이 3으로만 확인할 수 있으면 된다. |
| 13 | + * |
| 14 | + * |
| 15 | + * (int)sqrt(8) = 2이고 2부터 2까지 = 2 |
| 16 | + * 2로 8을 나눴을 때 나머지가 0이 아니라면 소수 |
| 17 | + * |
| 18 | + * 만약 11이라면 (int)sqrt(11) = 3 |
| 19 | + * 2~3 |
| 20 | + * 11%2 == 0 |
| 21 | + * 11%3 == 0 |
| 22 | + * 은 모두 거짓이니 소수 |
| 23 | + * |
| 24 | + * --------------------- |
| 25 | + * |
| 26 | + * 그런데 하나의 수가 소수인지 판별이 아니라 |
| 27 | + * 대량의 소수를 한 번에 판별하고자 할 때 = 에라토스테네스의 체 |
| 28 | + * 1. 1~25까지 있다고 했을 때 배열을 만든다. |
| 29 | + * 2. 2부터 시작하는데 자기 자신은 지우지 않고 2의 배수를 모두 지운다 |
| 30 | + * 3. 3도 동일 |
| 31 | + * --> 결국 이 배수를 모두 지운다는 것을 통해 소수만 남긴다 |
| 32 | + * */ |
| 33 | +public class Main { |
| 34 | +
|
| 35 | + // 하나의 수가 소수인지 판별 |
| 36 | + static boolean isPrimeNum(int x) { |
| 37 | + int end = (int) Math.sqrt(x); |
| 38 | + System.out.println(end); |
| 39 | + for (int i = 2; i <= end; i++) { |
| 40 | + if (x % i == 0) { |
| 41 | + return false; |
| 42 | + } |
| 43 | + } |
| 44 | + return true; |
| 45 | + } |
| 46 | +
|
| 47 | + static int[] array = new int[26]; |
| 48 | + // 에라토스테네스의 체 |
| 49 | + static void primeNums() { |
| 50 | + for (int i = 1; i <= 25; i++) { |
| 51 | + array[i] = i; |
| 52 | + } |
| 53 | +
|
| 54 | + for (int i = 2; i <= 25; i++) { |
| 55 | + if (array[i] == 0) { // 0은 지워졌다는 의미 |
| 56 | + continue; |
| 57 | + } |
| 58 | +
|
| 59 | + for (int j = i + i; j <= 25; j = j + i) { |
| 60 | + // 만약 i=2라면 2 자기자신 빼고 2의 배수를 다 지우는 것 |
| 61 | + array[j] = 0; |
| 62 | + } |
| 63 | + } |
| 64 | +
|
| 65 | + for (int i = 1; i <= 25; i++) { |
| 66 | + if (array[i] != 0) { |
| 67 | + System.out.println(array[i]); |
| 68 | + } |
| 69 | + } |
| 70 | + } |
| 71 | + public static void main(String[] args) { |
| 72 | + //System.out.println(isPrimeNum(7)); |
| 73 | + primeNums(); |
| 74 | +
|
| 75 | + } |
| 76 | +
|
| 77 | +
|
| 78 | +} |
| 79 | +
|
| 80 | +
|
| 81 | +``` |
0 commit comments