我希望有人可以帮我优化这个算法。这个解决方案在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
答案 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