一個比較高效的求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)

還是很可觀的。

在可以用自帶庫的情況下,最好用自帶的庫,如果不能用,用這個方法效率也是不錯。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容