代码之家  ›  专栏  ›  技术社区  ›  Jaco Pretorius

Ruby-判断一个数是否是素数

  •  14
  • Jaco Pretorius  · 技术社区  · 14 年前

    我正在处理电脑上的问题 Project Euler 我知道有一个内置的函数可以做到这一点 ,但我避免使用内置函数来帮助我学习。

     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
    
    12 回复  |  直到 14 年前
        1
  •  18
  •   Chris Schmich    7 年前

    是因为 = 优先级高于 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
    
        2
  •  12
  •   miksiii    10 年前

    Ruby附带了预定义的类,比如Prime。你所要做的就是在你的项目中加入这个类。

    require 'prime'
    

    然后,可以使用一些基本方法,例如 第一 要获取第一个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
    

        3
  •  8
  •   Nomas Prime    5 年前
    def prime(n)
      return false if n < 2
    
      (2..n/2).none?{|i| n % i == 0}
    end
    

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

        4
  •  5
  •   Deepak Padhy Manish Shrivastava    4 年前

    从循环中查找素数:

    def get_prime_no_upto(number)
      pre = [1]
      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
      pre + primes
    end
    

    使用方法如下:

    puts get_prime_no_upto(100)
    

        5
  •  4
  •   Saleh Rastani    8 年前
    def prime? n
      (2..Math.sqrt(n)).none? {|f| n % f == 0}
    end
    

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

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

    n = f1 * f2
    

    n 总是可以被它的平方根整除,所以 f1 f2 f1 * f2 将大于 n Math.sqrt(n) . 在寻找素数的情况下,只需要找到一个因子,所以我们应该从 2 到的平方根 n

        6
  •  3
  •   abonn    9 年前

    下面的代码将提示您输入一个用于基本检查的数字:

    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)
    
        7
  •  2
  •   Alberto    8 年前

    def prime? (n)
        if n <= 1
            false
        elsif n == 2
            true
        else 
            (2..n/2).none? { |i| n % i == 0}
        end
    end
    
        8
  •  1
  •   Jordan Poulton    10 年前

    仅供参考-回复:上面的DarkMouses prime方法-我发现它非常有用,但是有一些错误(我想!)需要解释的是:

    Range can't be coerced into Fixnum (TypeError)
    

    最后,我想你搞错了??如果你纠正了我提到的错误,如果它不是素数,它将返回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
    

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

        9
  •  0
  •   Ulysse BN    8 年前

    根据细节,这有点离题,但标题正确:在ruby中使用bash集成,您可以做到:

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

    猛击 factor 函数返回一个数加上他所有的因子,所以如果这个数是素数,就会有两个字计数。

    这对我很有用 代码高尔夫

        10
  •  0
  •   Praetorian    7 年前

    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
    
        11
  •  0
  •   Arnold    6 年前
    def prime?(n)
      if n <= 1
      return false
    
      else (2..n-1).to_a.all? do |integer|
       n % integer != 0
    
       end
      end
    end
    

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

        12
  •  0
  •   Nsikan Sylvester    5 年前
    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]

        13
  •  -3
  •   sounish nath    6 年前

    **对于一个简单的方法**

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

    现在将该文件保存为所需名称,这将自动生成前20个素数!!:-)