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)
还是很可观的。
在可以用自带库的情况下,最好用自带的库,如果不能用,用这个方法效率也是不错。
网友评论