숫자가 소수인지 확인 - Ruby

환영하다



오늘의 좋은 시간, 친애하는 친구, 코더 및 애호가.
나는 오랫동안 글을 올리지 않았고 주로 나 자신을 개선하고 몇 가지 부수적인 프로젝트를 진행했습니다. 그러나 내가 배우고 행한 것을 나누고자 하는 의지는 여전히 내 안에 뜨겁게 타오르고 있다.
알고리즘에 대한 몇 가지 작은 기사를 공유하기로 결정했고 작은 것부터 시작하기로 결정했습니다.
오늘은 제공된 숫자가 소수인지 확인하는 알고리즘을 살펴보겠습니다.

소수란 무엇입니까?



코드를 작성하기 전에 정확히 소수가 무엇인지 이해해 봅시다. 소수는 자신 또는 1로만 나누어지는 수입니다. 따라서 소수의 속성을 충족할 수 있는 코드를 설계할 것입니다.
즉, 숫자가 2보다 작으면 즉시 'false'를 반환할 수 있습니다.



재현 단계


  • 제공된 숫자가 2 미만인 경우 false를 반환합니다(0과 1은 소수로 간주되지 않기 때문)
  • .
  • 2부터 'n-1'까지 모든 숫자를 실행하고 'n'은 매개 변수로 제공된 숫자이며 'n'이 이들 중 하나로 나누어 떨어지는지 확인합니다
  • .
  • 'n'을 [2...n-1] 범위의 숫자로 나눌 수 있는 경우 즉시 루프를 중단하고 'false'를 반환합니다
  • .
  • 3단계에서 결과를 반환하지 않은 경우 true를 반환합니다. 즉, 숫자가 소수
  • 임을 의미합니다.

    암호



    즉각적인 해결책을 원한다면 'prime?'을 사용할 수 있습니다. Ruby에서 제공하는 메서드입니다.

    # Pre-defined class
    require 'prime'
    
    # Initializing the numbers
    num1 = 17
    num2 = 90
    num3 = 29
    
    # Printing if prime or not
    puts num1.prime? # true
    puts num2.prime? # false
    puts num3.prime? # true
    


    Ruby는 지정된 범위의 모든 소수를 나열하는 방법도 제공합니다.

    require 'prime'
    
    Prime.each(27) do |prime|
      p prime
    end
    
    #=> 2, 3, 5, 7, 11, 13, 17, 19, 23
    



    루비 솔루션 - 1



    다음은 Ruby를 사용하여 숫자가 소수인지 확인하는 실제 솔루션입니다. 물론 입력된 숫자가 양수라고 가정합니다.

    def is_prime(num)
      return false if (num < 2)
    
      (2..(num - 1)).each do |n|
        return false if num % n == 0
      end
    
      true
    end
    



    루비 솔루션 - 2



    그리고 더 짧게 원하는 경우 하나의 라이너로 결과를 더 빨리 반환하는 것이 있습니다. [2...n-1] 범위의 모든 숫자를 검사하지 않기 때문에 [2...sqrt(n)] 사이의 숫자만 검사합니다.
    제곱근보다 큰 수의 약수가 없는 것으로 간주됩니다. 따라서 우리는 'n'의 제곱근까지만 숫자를 확인합니다.

    def is_prime?(num)
      return false if num < 2
      Math.sqrt(num)
        .to_i
        .downto(2)
        .each {|i| return false if num % i == 0}
      true
    


    위에 제공된 솔루션은 가장 최적의 솔루션 중 하나입니다. 그렇지 않으면 제공된 숫자의 절반까지인 [2...n/2] 사이의 숫자를 확인할 수도 있습니다. 그러나 물론 제곱근은 우리에게 더 적은 숫자를 제공합니다.


    Javascript 솔루션 - 하나의 라이너



    여기에서 'Ruby solution - 2'에서 제공하는 것과 거의 동일한 솔루션을 Javascript로 볼 수 있습니다.

    const isPrime = num => (num > 1) && Array(Math.floor(Math.sqrt(num)) - 1).fill(0).map((_, i) => i + 2).every(i => num % i !== 0);
    


    이 솔루션은 [2...sqrt(n)] 사이의 숫자가 'n'으로 나누어지지 않는지 여부를 확인합니다. 해당 영역에서 약수를 찾으면 false를 반환합니다.


    결론



    자, 이게 다야, 얘들아. 이 게시물에서 유용한 통찰력을 얻거나 적어도 Ruby 및 Javascript에서 아름다운 한 줄짜리 코드 스니펫을 보게 되어 기뻤기를 바랍니다.
    일반적인 간단한 알고리즘에 대한 다른 유용한 솔루션을 계속 게시하려고 노력할 것이므로 Dev.to 및 모든 개발자 커뮤니티와 함께 ​​계속 개선하십시오.
    안전하고 행운을 빕니다!!!

    좋은 웹페이지 즐겨찾기