Ruby - 确定数字是否为素数

时间:2010-08-29 10:18:30

标签: 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

13 个答案:

答案 0 :(得分:17)

这是因为=的优先级高于or。请参阅下面的Ruby's operator precedence table(从最高到最低的优先级):

[ ] [ ]=
**
! ~ + -
* / %
+ -
>> <<
&
^ |
<= < > >=
<=> == === != =~ !~
&&
||
.. ...
? :
= %= { /= -= += |= &= >>= <<= *= &&= ||= **=
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

答案 1 :(得分:9)

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

require 'prime'

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

我希望你觉得这很有用。

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

从循环中查找素数:

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)

干杯!

答案 4 :(得分:3)

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

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)

答案 5 :(得分:3)

def prime? n
  (2..Math.sqrt(n)).none? {|f| n % f == 0}
end

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

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

n = f1 * f2

n始终可以被平方根整除,因此f1f2都不能大于n的平方根,否则f1 * f2将大于{{} 1}}。因此,至少一个因子小于或等于n。在查找素数的情况下,只需找到一个因子,因此我们应该从Math.sqrt(n)循环到2的平方根。

答案 6 :(得分:1)

FYI - re:上面的DarkMouses主要方法 - 我发现它真的有用,但有一些错误(我认为!)需要解释:

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

Range can't be coerced into Fixnum (TypeError)

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

最后,我认为你错了方法吗?如果你纠正了我提到的错误,如果它不是素数则返回true,如果是IS则返回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

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

答案 7 :(得分:0)

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

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

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

这仅适用于代码高尔夫

答案 8 :(得分:0)

我试过这个并且有效:

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

答案 9 :(得分:0)

def prime?(n)
  if n <= 1
  return false

  else (2..n-1).to_a.all? do |integer|
   n % integer != 0

   end
  end
end

从我的黄金时代开始?实验室。从消除所有小于或等于1的整数开始。

答案 10 :(得分:0)

def prime(n)
    pn = [2]
    if n < 2
       return false

   else

     (2..n).each do |i|
       not_prime = false

        (2..Math.sqrt(i).ceil).each do |j|
           not_prime = true if i % j == 0    
        end
       pn.push(i) unless not_prime
    end

 end

return pn

end

p素数(30)给出

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

答案 11 :(得分:0)

如果数字是素数,它将返回真。

def prime_number(number)
  
    (2..(number-1)).each do |value|   
        
        if (number % value) == 0
            return false
        end
        
        return true
    end    
end

puts prime_number(4)

答案 12 :(得分:-2)

**简单的方法** 首次安装优质宝石

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

现在将文件另存为您想要的名称,这将自动生成前20个素数! :-)