一个比较高效的求n以内的质数的方法

def find_prime(n)
  numbers = []
  
  for i in 2..n
    numbers[i] = i
  end

  for i in 2..Math.sqrt(n)
    #next unless numbers[i]
    (i*i).step(n,i) do |j|
      numbers[j] = nil
    end
  end

  numbers.compact!
end

用ruby自带的库求的话,更简单

require 'prime'
Prime.take_while {|e| e < n}

对比一下:

n = 10000000
Benchmark.bm(10) do |t|
  t.report("find_prime") { find_prime(n) }
  t.report("Prime") {Prime.take_while {|e| e < n}}
end

结果:

                 user     system      total        real
find_prime   2.465000   0.078000   2.543000 (  2.562321)
Prime        1.326000   0.031000   1.357000 (  1.373573)

n = 10000000时,也没有超过3秒。
n = 1000000时,结果如下:

                 user     system      total        real
find_prime   0.203000   0.031000   0.234000 (  0.239333)
Prime        0.187000   0.000000   0.187000 (  0.185985)

还是很可观的。

在可以用自带库的情况下,最好用自带的库,如果不能用,用这个方法效率也是不错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容