2014-09-11 41 views
0

我正在尝试编写一个方法,它需要一个数字并检查它是否为素数。在做一些研究之后,快速检查方法是将数字除以2和sqrt之间的每个数字(我们检查的数字)。我希望我的方法在素数时返回true,否则返回false。检查红宝石中的素数

因此,我试图编写代码,使我有逻辑意义,但我得到一个错误。下面是我写:

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 

仅供参考,这不是功课。我正在经历coderbyte问题。任何帮助表示赞赏!

回答

2

你面对的是接近的问题,这是不正确的Ruby:(counter == Math.sqrt(num).ceil) ? "false"

?,作为一个经营者,是三元操作符... ? ... : ...的一部分,并且总是在对与:,因为你写在你的下一行。再次,过度使用三元运算符也不好。控制流程也存在问题:在评估"true"后,循环将继续,counter不会更改,并且您得到无限循环。

我建议你研究算法应该是什么。必要时用英文书写。然后确保您正确地将其转换为Ruby。

此外,Ruby方法应该是蛇的情况下(小写字母之间带下划线),所以PrimeTime不是一个好名字。如果您要返回布尔值(truefalse),我建议prime?(因为标识符中也允许使用问号)。如果你要返回一个字符串(就像你试图做的那样),试试check_for_primality或类似的东西(没有问号)。

另外...如果余数为零,数字是而不是素数。我想你已经开始测试了。

如果您仍然难倒:

高清素(NUM); (2..Math.sqrt(num))。每个do | counter |; if(num%counter == 0);返回假结束;真正;结束

编辑在重写代码:break & return false没有做你想要的。它们都是控制语句;如果你breakreturn不会发生。即使如此,如果休息时间不在那里,最好写and,或者至少&&,而不是&(二进制和)。

你的逻辑仍然是错误的,但是: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) – 2014-09-11 04:13:50

+0

@ J-Dizzle:我认为这对于一个挣扎着语法和基本的流程控制,我看到的Ruby + TDD的最佳介绍是[RubyKoans](http://rubykoans.com/) – Amadan 2014-09-11 04:21:51

0

在我看来,你的这种方式比它应该更复杂。这是我建议使用的代码。

require 'prime' 

puts 2.prime? 

它那么简单。并且如果你想使你自己的方法

require 'prime' 

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

红宝石带有预定义的类,如Prime。你所要做的就是把这个课程放到你的项目中。

require 'prime' 

比,你可以使用一些Prime methods第一的拿到第一个X首要元素:

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

或者你可以做这样的事情:

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

我希望这可能对你有所帮助..通过miksiii

+0

我明白了,我只是想建立自己的练习方法。 – theamateurdataanalyst 2014-09-11 06:02:02

0

你可以这样做,不用Math.sqrt这样:

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