2014-09-11 7 views
0

Я пытаюсь написать метод, который принимает число и проверяет, имеет ли его простое число. После выполнения некоторых исследований быстрый способ проверки состоит в том, чтобы разделить число на каждое число между 2 и sqrt (число, которое мы проверяем). Я хочу, чтобы мой метод возвращал true, если это простое число и false, если это не так.Проверка простого числа в ruby ​​

Поэтому я попытался написать код, который сделал логический смысл для меня, но я получаю сообщение об ошибке. Вот что я написал:

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 

Это дает мне

(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 

FYI, это не домашнее задание. Я переживаю проблемы с кодербетом. Любая помощь приветствуется!

ответ

2

Непосредственная проблема вы столкнулись есть, это не является действительным Ruby: (counter == Math.sqrt(num).ceil) ? "false"

?, как оператор, является частью троичного оператора ... ? ... : ..., и всегда приходит в паре с :, как вы пишете в следующей строке. Опять же, чрезмерное использование тригонального оператора тоже не очень хорошо. У вас также есть проблема с потоком управления: после оценки "true" цикл будет продолжаться, counter не изменится, и вы получите бесконечный цикл.

Предлагаю вам разработать алгоритм. При необходимости напишите на английском языке. Затем убедитесь, что вы правильно конвертируете его в Ruby.

Кроме того, методы Ruby должны быть в футляре для змей (строчные буквы с подчеркиваниями между словами), поэтому PrimeTime - это нехорошее имя. Я предлагаю prime? (поскольку вопросительные знаки также разрешены в идентификаторах), если вы будете возвращать логическое значение (true или false). Если вы возвращаете строку (как вы, кажется, пытаетесь сделать), попробуйте check_for_primality или что-то подобное (без знака вопроса).

Также ... если остаток равен нулю, то число не prime. Я думаю, что вы проверили свои тесты.

Если вы все еще озадачен:

Защиту простое (число); (2..Math.sqrt (num)). Each do | counter |; if (num% counter == 0); return false end end; правда; конец

EDIT На переписан код: break & return false не делать то, что вы хотите. Они оба являются контрольными заявлениями; если вы break, return не произойдет. Даже если бы это было так, если перерыва там не было, было бы лучше написать and или не менее &&, а не & (двоичный и).

Ваша логика по-прежнему не правильная: PrimeTime(16) - это, например, не то, что я ожидал бы от функции проверки подлинности.

+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 = + 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. Все, что вам нужно сделать, это потребовать, чтобы этот класс был включен в ваш проект.

require 'prime' 

Чем, вы можете использовать некоторые из Prime methods, таких как первого получить первый х простые элементы:

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

Или вы могли бы сделать что-то вроде этого:

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

Я надеюсь, что это может вам помочь .. via 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