如何优化打印n个素数的算法

时间:2016-03-30 00:41:31

标签: ruby optimization primes

我希望有人可以帮我优化这个算法。这个解决方案在irb中做了我想要的,但是在代码战网站上超时了。

class Primes
  def self.first(n)
    arr = []

    i ||= 2

    until arr.length == n

      is_prime = true

      (2..(i**0.5)).step do |num|
        if i % num == 0
          is_prime = false
          break
        end
      end

      arr << i if is_prime == true

      i += 1

    end

    arr
  end
end

3 个答案:

答案 0 :(得分:2)

我认为这个实现是你可能获得的最快的实现之一:

if (!empty($myobj->Obj)) //Not empty

而且......我们已经完成了。这就是要做的一切。

require 'prime' Primes = Prime # so that we have the same interface as in your question Prime,所以我们现在可以做到

Enumerable

获得前10 000个素数。

答案 1 :(得分:0)

您最初忘记定义is_prime,因此您的代码无法运行。

无论如何,你可以做的一件事是放弃Math.sqrt而是计算num*num。一般来说Math.sqrt比乘法慢得多:

class Primes

  def self.first(n)

    prime_array = []

    i = 2

    until prime_array.length == n

      is_prime = true

      num = 2
      until num*num > i
        if i % num == 0
          is_prime = false
          break
        end
        num += 1
      end

      if is_prime != false
        prime_array << i
      end

      i += 1

    end

    prime_array

  end

end

答案 2 :(得分:0)

假设您想获得前n个素数,而不是前n个小于或等于n的素数。

class Primes

  def self.first(n)
    return [] if n <= 0

    primes = [2]

    i = 3
    while primes.size < n
      primes.push(i) unless primes.any?{|p| i % p == 0}
      i += 2
    end

    primes

  end

end