2014-09-11 2 views
0

숫자를 취하고 소수인지 검사하는 방법을 쓰려고합니다. 몇 가지 조사를 한 후 빠른 방법은 2와 sqrt 사이의 모든 숫자로 숫자를 나누는 것입니다 (우리가 확인하는 숫자). 내 메소드가 소수 일 경우 true를 반환하고 그렇지 않은 경우 false를 반환합니다.루비의 소수 찾기

그래서 논리적으로 이해되는 코드를 작성하려고 시도했지만 오류가 발생했습니다. 여기에 내가 쓴 무엇 : 이것은 참고로 나에게

(eval):429: (eval):429: compile error (SyntaxError) 
(eval):422: syntax error, unexpected '\n' 

재 작성 코드

def prime?(num) 
    (2..Math.sqrt(num).ceil).to_a.each do |number| 
     if num % number == 0 
      return false 
     else 
      return true 
     end 
    end 
end 

을 제공

def PrimeTime(num) 
    counter = 2 
    while counter <= Math.sqrt(num).ceil 
     (counter == Math.sqrt(num).ceil) ? "false" 
     (num % counter == 0) ? "true" : counter += 1 
    end 
end 

,이 숙제를하지 않습니다. 나는 코더 바이트 문제를 겪고있다. 어떤 도움을 주셔서 감사합니다! 의의 삼중 연산자 ... ? ... : ...의 일부 (counter == Math.sqrt(num).ceil) ? "false"

?, 연산자로, 그리고 당신이 쓰는대로 항상하는 :와 쌍으로 제공 :

답변

2

당신이 직면하고있는 근접 문제는이 유효 루비하지 않습니다 다음 줄에. 그렇다면 다시, 삼중 연산자의 남용도 좋지 않습니다. 또한 제어 흐름에 문제가 있습니다. "true"을 평가 한 후 루프가 계속 진행되고 counter은 변경되지 않으며 무한 루프가 발생합니다.

알고리즘이 무엇인지 알아내는 것이 좋습니다. 필요한 경우 영어로 작성하십시오. 그런 다음 루비로 올바르게 변환했는지 확인하십시오.

또한 Ruby 메서드는 뱀 케이스 (단어 사이에 밑줄이있는 소문자) 여야하므로 PrimeTime은 좋은 이름이 아닙니다. 부울 값 (true 또는 false)을 반환 할 경우 prime? (물음표가 식별자에 허용됨)을 제안합니다. 문자열을 반환하는 경우 (시도하고있는 것처럼 보임) check_for_primality 또는 유사한 물음표를 사용하십시오.

또한 ... 나머지가 0이면 숫자는 이 아니며 소수입니다. 내 생각에 당신의 검사가 바뀌 었다고 생각합니다. ? 당신은 여전히 ​​난처한 상황에 빠진 경우

:

데프 프라임 (NUM)를; (2..Math.sqrt (num)). 각 do | counter | if (num % counter == 0); return false end end; 참된; 다시 코드에

편집을 종료 : break & return false을 당신이하고 싶은 일을하지 않습니다. 둘 다 제어문입니다. break 인 경우 return이 발생하지 않습니다. 그랬더라도, 휴식 시간이 없다면, 또는 적어도 &&이 아닌 & (이진 및)을 쓰는 것이 낫습니다.

로직이 여전히 잘못되어 있습니다. PrimeTime(16)true입니다. 예를 들어, 소수 테스트 기능에서 기대할 수있는 것은 아닙니다.

+0

"알고리즘을 이해해야합니다. 필요한 경우 영어로 작성하십시오. 그런 다음 Ruby로 올바르게 변환하십시오. "- [Cucumber] (http://cukes.info/). [Rpec Book] (http://www.amazon.com/RSpec-Book- 행동 - 발달 - 오이/dp/1934356379/ref = sr_1_1? s = books & ie = UTF8 & qid = 1410408767 & sr = 1-1 & keywords = the + rspec + book –

+0

@ J-Dizzle : 나는 너무 어려울 때가있다. 구문과 기본 흐름 제어. Ruby + TDD에 대한 최고의 소개 [RubyKoans] (http://rubykoans.com/). – Amadan

0

내 의견으로는, 당신이해야 할 것보다 더 복잡한 방법입니다. 다음은 제가 사용하도록 권하는 코드입니다.

require 'prime' 

puts 2.prime? 

간단합니다. 당신이 만들고 싶어하고 자신의 방법

require 'prime' 

def prime?(num) 
    num.prime? 
end 
0

루비는 Prime 같은 미리 정의 된 클래스와 함께 제공됩니다. 당신이해야 할 일은 그 수업을 당신의 프로젝트에 요구하는 것뿐입니다.

Prime.first(5) # Ret => [2, 3, 5, 6, 11] 

아니면 이런 일 할 수있는 :

Prime.each(100) do |prime| 
    p prime # Ret => [2, 3, 5, 7, 11, ..., 97] 
end 

require 'prime' 

보다, 당신은 주요 요소를 먼저 얻을 x에 Prime methods 같은 로 첫의 일부를 사용할 수 있습니다 이게 너에게 도움이되기를 바랍니다. .. miksiii 경유

+0

나는 그것을 얻는다. 단지 연습을위한 내 자신의 방법을 만들고 싶었다. – theamateurdataanalyst

0

다음과 같이 Math.sqrt없이이 작업을 수행 할 수 있습니다.

def is_prime?(number) 
    (2..number-1).each {|n| return false if number <= 1 || number % n == 0} 
    return true 
end