ABOUT ME

이 블로그는 주로 제가 공부한 내용을 정리하는 블로그입니다. 부족한 부분이나 틀린 내용이 있다면 계속해서 수정해나갈 생각이니, 언제든지 편하게 질문이나 피드백을 주시면 감사하겠습니다.

Today
Yesterday
Total
  • 효율적인 소수 판별법(√ n까지만 나눠보면 되는 이유)
    카테고리 없음 2021. 9. 13. 23:01
    소수
    소수란 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수를 말한다.

    즉 1과 자기 자신이 아닌 수(2~n)로 나눠지면 소수이고, 나눠지지 않으면 소수가 아니다.

     

     

    이를 코드로 구현해보자(C++)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int IsPrime(int num)
    {
        if (num < 2)
            return false;
     
        for (int i = 2; i < num; ++i)
        {
            if (num % i == 0)
                return false;
        }
     
        return true;
    }
    cs

    하지만 이는 너무 비효율적이다.

     

     

     

    사실 √ n까지만 확인을 해보면 된다.

     

    구체적인 예를 보자.

    100이라는 수가 소수인지 아닌지 판별해보도록 하겠다.

    100의 약수는 100, 50, 25, 20, 10, 5, 4, 2, 1이다

    이 약수들의 곱으로 100이라는 수를 표현해보면 아래와 같다.

     

     

    같은 수의 곱으로 이루어진 구간을 넘어가면 수의 위치만 바뀌었을 뿐 이미 나왔던 곱셈 패턴이 반복되는 것을 알 수 있다.

    즉 100이 4로 나눠진다면 25로 나눠볼 필요가 없다는 것을 의미하고, 5로 나눠진다면 20로 나눠볼 필요가 없다는 것을 의미한다.

     

     

     

    구현(C++)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int IsPrime(int num)
    {
        if (num < 2)
            return false;
     
        for (int i = 2; i*<= num; ++i) // i <= sqrt(num)과 같다
        {
            if (num % i == 0)
                return false;
        }
     
        return true;
    }
    cs

     

     

Designed by Tistory.