Ruby – 确定数字是否为素数

我正在解决Project Euler上的问题,自学Ruby编程。 我知道有一个内置函数可以做到这一点 ,但我正在避免使用内置函数来帮助我学习。

所以我必须编写一个方法来确定一个数字是否是素数。 第一种方法有效,但第二种方法没有。 有人可以解释为什么吗

def is_prime n for d in 2..(n - 1) if (n % d) == 0 return false end end true end def is_prime2 n foundDivider = false for d in 2..(n - 1) foundDivider = ((n % d) == 0) or foundDivider end not foundDivider end 

这是因为=的优先级高于or 。 请参阅下面的Ruby的运算符优先级表 (从最高到最低的优先级):

 [ ] [ ]= ** ! ~ + - * / % + - >> << & ^ | <= < > >= <=> == === != =~ !~ && || .. ... ? : = %= { /= -= += |= &= >>= <<= *= &&= ||= **= defined? not or and if unless while until begin/end 

有问题的行被解析为......

 (foundDivider = ((n % d) == 0)) or foundDivider 

......这当然不是你的意思。 有两种可能的解决方案:

强制优先权是你真正的意思......

 foundDivider = (((n % d) == 0) or foundDivider) 

...或使用|| 而不是运算符,其优先级高于=

 foundDivider = ((n % d) == 0) || foundDivider 

Ruby带有预定义的类,如Prime。 您所要做的就是要将该课程纳入您的项目。

 require 'prime' 

比,你可以使用一些Prime方法,比如获得第一个x 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 

希望这个对你有帮助。

 def prime(n) (2..n/2).none?{|i| n % i == 0} end 

素数是除了自身和1之外没有正除数的任何数字。

从循环中查找素数:

 def get_prime_no_upto(number) start = 2 primes = (start..number).to_a (start..number).each do |no| (start..no).each do |num| if ( no % num == 0) && num != no primes.delete(no) break end end end primes end 

并使用如下:

 puts get_prime_no_upto(100) 

干杯!

这是代码,它将提示您输入一个用于检查的数字:

 puts "welcome to prime number check" puts "enter number for check: " n = gets n = n.to_i def prime(n) puts "That's not an integer." unless n.is_a? Integer is_prime = true for i in 2..n-1 if n % i == 0 is_prime = false end end if is_prime puts "#{n} is prime!" else puts "#{n} is not prime." end end prime(n) 
 def prime? n (2..Math.sqrt(n)).none? {|f| n % f == 0} end 

因子范围应从2开始并以n的平方根结束,因为每个数字都可以被1整除,没有数字可以被大于其平方根的两个数字整除。

说明:非素数是两个数的乘积。

 n = f1 * f2 

n总是可以被平方根整除,因此f1f2都不能大于n的平方根,否则f1 * f2将大于n 。 因此,至少一个因子小于或至多等于Math.sqrt(n) 。 在找到素数的情况下,找到一个因子是唯一必要的,所以我们应该从2n平方根循环。

基于Darmouse的答案,但包括边缘案例

 def prime? (n) if n <= 1 false elsif n == 2 true else (2..n/2).none? { |i| n % i == 0} end end 

仅供参考 – 重新:上面的DarkMouses主要方法 – 我发现它真的很有帮助,但有一些错误(我认为!)需要解释:

它应该是括号而不是方括号……否则你会得到一个TypeError

 Range can't be coerced into Fixnum (TypeError) 

其次,’false’之前的第一个冒号也会导致错误。 据我所知,这是不正确的语法。 摆脱它。

最后,我认为你得到了错误的方式? 如果你纠正了我提到的错误,如果它不是素数,则返回true,如果是,则返回false。

您可以完全放弃三元运算符,只需执行以下操作:

 def prime?(n) (2..n/2).none?{|i| n % i == 0} end 

显然它没有覆盖边缘情况(0,1,2),但让我们不分裂头发。

…对于那些喜欢发型的人来说,这是我对这个问题的完整解决方案:

  def prime?(n) return false if n < 2 (2..Math.sqrt(n)).none? {|num| length % num == 0} end 

希望我没有错过任何东西:)

根据细节,这有点偏离主题,但对标题是正确的:在ruby中使用bash集成你可以做到:

 def is_prime n `factor #{n}`.split.count < 3 end 

bash factor函数返回一个数字加上他的所有因子,所以如果数字为素数,则会有两个单词计数。

这仅适用于代码高尔夫

我试过这个并且它有效:

 def prime?(n) return false if n < 2 return true if n == 3 || n == 2 if (2...n-1).any?{|i| n % i == 0} false else true end end 

**简单的简单方法**首先安装PREME GEM

 require 'prime' `p prime.first(20)` 

现在将该文件保存为您想要的名称,这将自动生成前20个素数! 🙂