Skip to content

Latest commit

Β 

History

History
152 lines (115 loc) Β· 4.76 KB

PrimeNum.md

File metadata and controls

152 lines (115 loc) Β· 4.76 KB

μ†Œμˆ˜ κ΅¬ν•˜κΈ° (μ•„λ¦¬μŠ€ν† ν…Œλ„€μŠ€μ˜ 체)

written by sohyeon, hyemin πŸ’‘


* μ†Œμˆ˜λž€?

μžμ‹ κ³Ό 1 μ΄μ™Έμ˜ μ •μˆ˜λ‘œ λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” μ •μˆ˜

1. μ†Œμˆ˜ κ΅¬ν•˜κΈ°

1000 μ΄ν•˜μ˜ μ •μˆ˜ 쀑 μ†Œμˆ˜μΈ 값을 λ‚˜μ—΄ν•΄ 보자

λ‘λ²ˆμ§Έ forλ¬Έμ—μ„œ μžμ‹  외에 λ‹€λ₯Έ μ •μˆ˜λ‘œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ”μ§€ ν™•μΈν•œλ‹€.

class PrimeNum{
    public static void main(Stirng[] args){
        // 1은 μ†Œμˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ 2λΆ€ν„° μ‹œμž‘
        for(int n=2; n<=1000; n++){
            int i;
            for(i=2; i<n; i++){
                if(n%i==0)  // λ‚˜λˆ„μ–΄ 떨어지면 μ†Œμˆ˜κ°€ μ•„λ‹˜
                    break;
            }
            if(n==i)        // λ§ˆμ§€λ§‰κΉŒμ§€ λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠμŒ
                System.out.println(n);
        }
    }
}

μœ„μ˜ μ˜ˆμ‹œλŠ” λΆˆν•„μš”ν•œ λ‚˜λˆ—μ…ˆ 연산을 ν•˜κ²Œ λ˜μ–΄ λΉ„νš¨μœ¨μ μ΄λ‹€.
μ†Œμˆ˜μΈμ§€ ν™•μΈν•˜λ €λŠ” n보닀 μž‘μ€ μ†Œμˆ˜λ“€λ‘œλΆ€ν„° λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ”λ‹€λ©΄ μ†Œμˆ˜μΌ 것이닀.
(예λ₯Ό λ“€μ–΄ 7이 μ†Œμˆ˜μΈμ§€ ν™•μΈν•œλ‹€λ©΄, 7보닀 μž‘μ€ μ†Œμˆ˜ 2,3,5λ§ŒμœΌλ‘œλ„ 확인이 κ°€λŠ₯ν•˜λ‹€.)

κ°œμ„  μ½”λ“œ 1

class PrimeNum2{
    public static void main(String args[]){
        int ptr = 0;        // 찾은 μ†Œμˆ˜ 개수
        int prime[] = new int[500];     // μ†Œμˆ˜λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄

        prime[ptr++] = 2;   // 2λŠ” μ†Œμˆ˜

        for(int n=3; n<=1000; n+=2){    // ν™€μˆ˜λ§Œ, μ–΄μ°¨ν”Ό μ§μˆ˜λŠ” 2둜 λ‚˜λˆ„μ–΄ 지기 λ•Œλ¬Έμ— μ†Œμˆ˜κ°€ μ•„λ‹˜
            int i;
            for(i=1; i<ptr; i++){       // μ°Ύμ•„λ‘” μ†Œμˆ˜λ‘œ λ‚˜λˆ„μ–΄ λ΄„
                if(n%prime[i]==0)
                    break;
            }
            if(ptr==i)
                prime[ptr++] = n;   // μ†Œμˆ˜λ₯Ό 배열에 μ €μž₯
        }
    }
}

κ°œμ„ λœ μ½”λ“œλ„ 썩 쒋은 νš¨μœ¨μ„±μ„ κ°–μ§€λŠ” μ•ŠλŠ”λ‹€.
μ†Œμˆ˜λŠ” n의 제곱근 μ΄ν•˜μ˜ μ–΄λ–€ μ†Œμˆ˜λ‘œλ„ λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ”λ‹€λŠ” 속성이 있기 떄문이닀.

κ°œμ„ λœ μ½”λ“œ 2

class PrimeNum3{
    public static void main(String[] args){
        int ptr = 0;
        int prime[] = new int[500];

        prime[ptr++]=2;
        prime[ptr++]=3;

        for(int n=5; n<=1000; n+=2){
            boolean flag = false;
            for(int i=1; prime[i]*prime[i]<=n;i++){
                if(n%prime[i]==0){
                    flag = true;
                    break;
                }
            }
            if(!flag){
                prime[ptr++]=n;
            }
        }
    }
}

첫번째 κ°œμ„  μ½”λ“œλ³΄λ‹€ λ‘λ²ˆμ§Έ κ°œμ„  μ½”λ“œμ˜ μ—°μ‚° νšŸμˆ˜κ°€ 3λ°° 적닀.

배열을 ν™œμš©ν•˜λ©° μ§„ν–‰ν•œ μœ„μ˜ μ•Œκ³ λ¦¬μ¦˜ 외에 μ†Œμˆ˜λ₯Ό κ΅¬ν•˜λŠ” 쒋은 μ•Œκ³ λ¦¬μ¦˜ 이둠이 μžˆλ‹€.

2. μ•„λ¦¬μŠ€ν† ν…Œλ„€μŠ€μ˜ 체 ⭐

2-1. μ•Œκ³ λ¦¬μ¦˜ μˆœμ„œ

  1. 2λΆ€ν„° μ†Œμˆ˜λ₯Ό κ΅¬ν•˜κ³ μž ν•˜λŠ” κ΅¬κ°„μ˜ λͺ¨λ“  수λ₯Ό λ‚˜μ—΄ν•œλ‹€.

  2. 2λŠ” μ†Œμˆ˜μ΄λ―€λ‘œ 였λ₯Έμͺ½μ— 2λ₯Ό μ“΄λ‹€.

  3. 자기 μžμ‹ μ„ μ œμ™Έν•œ 2의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€.

  4. λ‚¨μ•„μžˆλŠ” 수 κ°€μš΄λ° 3은 μ†Œμˆ˜μ΄λ―€λ‘œ 였λ₯Έμͺ½μ— 3을 μ“΄λ‹€.

  5. 자기 μžμ‹ μ„ μ œμ™Έν•œ 3의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€.

  6. λ‚¨μ•„μžˆλŠ” 수 κ°€μš΄λ° 5λŠ” μ†Œμˆ˜μ΄λ―€λ‘œ 였λ₯Έμͺ½μ— 5λ₯Ό μ“΄λ‹€.

  7. 자기 μžμ‹ μ„ μ œμ™Έν•œ 5의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€.

  8. λ‚¨μ•„μžˆλŠ” 수 κ°€μš΄λ° 7은 μ†Œμˆ˜μ΄λ―€λ‘œ 였λ₯Έμͺ½μ— 7을 μ“΄λ‹€.

  9. 자기 μžμ‹ μ„ μ œμ™Έν•œ 7의 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€.

  10. μœ„μ˜ 과정을 λ°˜λ³΅ν•˜λ©΄ κ΅¬ν•˜λŠ” κ΅¬κ°„μ˜ λͺ¨λ“  μ†Œμˆ˜κ°€ λ‚¨λŠ”λ‹€.

2-2. μ½”λ“œ

즉, 2λΆ€ν„° NκΉŒμ§€μ˜ 수 μ€‘μ—μ„œ μ†Œμˆ˜λ₯Ό μ°ΎλŠ”λ‹€κ³  ν–ˆμ„ λ•Œ
N의 μ œκ³±κ·Όλ³΄λ‹€ μž‘μ€ μ†Œμˆ˜μ˜ 배수λ₯Ό λͺ¨λ‘ μ§€μš°κ³  λ‚¨λŠ” μˆ˜λŠ” λͺ¨λ‘ μ†Œμˆ˜μ΄λ‹€.

λ‘λ²ˆμ§Έ κ°œμ„  μ½”λ“œμ™€ 같은 논리λ₯Ό ν™œμš©ν•˜μ§€λ§Œ λ‹€λ₯Έμ μ΄ μžˆλ‹€λ©΄
μ†Œμˆ˜λ§Œ μ°Ύμ•„λ‚΄λŠ”κ²Œ μ•„λ‹ˆλΌ μ†Œμˆ˜μ˜ λ°°μˆ˜λ“€μ„ λͺ¨λ‘ μ§€μ›Œ μ†Œμˆ˜λ§Œ λ‚¨κΈ°λŠ” 것이 차이이닀.

public class Eratostenes {
    public static void main(String[] args) {
        boolean[] arr = new boolean[1001];    //true 이면 ν•΄λ‹Ή 인덱슀 μ†Œμˆ˜.
        arr[0] = arr[1] = false;
        for(int i=2; i<=1000; i+=1) {
            arr[i] = true;
        }
 
        //2 λΆ€ν„° 숫자λ₯Ό ν‚€μ›Œκ°€λ©° λ°°μˆ˜λ“€μ„ μ œμ™Έ(false ν• λ‹Ή)
        for(int i=2; i*i<=1000; i+=1) {
            for(int j=i*i; j<=1000; j+=i) {
                arr[j] = false;        //2λ₯Ό μ œμ™Έν•œ 2의 배수 false
            }
        }
        System.out.println("Prime number list from 2 to 1000 : ");
        for(int i=0; i<=1000; i+=1) {
            if(true == arr[i]) {
                System.out.print(i + " ");
            }
        }
    }
}

μœ„μ˜ κ°œμ„ μ½”λ“œμ™€ 달리 쀑첩 for문도 μ—†μ–΄ μ‹œκ°„λ³΅μž‘λ„λ„ 더 μž‘κ³  νš¨μœ¨μ μ΄λ‹€.
μ†Œμˆ˜μ™€ κ΄€λ ¨λœ μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό ν•΄κ²°ν•  λ•Œ μ°Έκ³ ν•˜λ©΄ 될 λ“― ν•˜λ‹€.