【问题标题】:Ruby - method for generating prime numbersRuby - 生成素数的方法
【发布时间】:2015-08-06 21:23:18
【问题描述】:

我正在编写一个方法 - prime_numbers - 当传递一个数字 n 时,它返回 n 个素数。它不应该依赖 Ruby 的 Prime 类。它的行为应该是这样的:

prime_numbers 3
=> [2, 3, 5]
prime_numbers 5
=> [2, 3, 5, 7, 11]

我对这种方法的第一次尝试如下:

def prime_numbers(n)
  primes = []
  i = 2

  while primes.length < n do
    divisors = (2..9).to_a.select { |x| x != i }
    primes << i if divisors.all? { |x| i % x != 0 }
    i += 1
  end
  primes
end

编辑: 正如所指出的那样,当前的方法是错误的,因为它被限制为只考虑最多 9 的除数。因此,任何由两个大于 9 的相等素数组成的完全平方本身被视为素数。

如果有人有意见或建议可以分享更好的解决方法,我们将不胜感激。

【问题讨论】:

标签: ruby math primes


【解决方案1】:

请注意,如果数字是合数,则它的除数必须小于或等于 $\sqrt{n}$。所以你真的只需要检查 $sqrt{n}$ 就可以找到一个除数。

【讨论】:

    【解决方案2】:

    在 Ruby 1.9 中有一个 Prime 类,您可以使用它来生成素数,或测试一个数字是否为素数:

    require 'prime'
    
    Prime.take(10) #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
    Prime.take_while {|p| p < 10 } #=> [2, 3, 5, 7]
    Prime.prime?(19) #=> true
    

    Prime 实现了 each 方法并包含 Enumerable 模块,因此您可以执行各种有趣的操作,例如过滤、映射等。

    【讨论】:

      【解决方案3】:

      对您的实施有了一个好主意:

      @primes = []
      def prime_numbers(n)
        i = 2
        while @primes.size < n do
          @primes << i if is_prime?(i)
          i += 1
        end
        @primes
      end
      
      def is_prime?(n)
        @primes.each { |prime| return false if n % prime == 0 }
        true
      end
      

      这是基于非质数具有质因数的想法:)

      【讨论】:

      • 感谢您的反馈 - 这非常有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多