我在Coderbyte上做了以下挑战,它没有计算一些更大的数字,所以我假设我的功能很慢。在我的计算机上,计算第1000个素数需要0.045秒。
提示符是:
让PrimeMover(num)函数返回numth素数。范围从1到10 ^ 4。例如:如果num为16,则输出应为53,因为53是第16个素数。
使用下面的框中的参数测试功能,使用不同的参数测试您的代码。
这是我的代码:
def PrimeMover(num)
start = Time.now
return 2 if num == 1
return 3 if num == 2
return 5 if num == 3
counter = 3
7.upto(10**4).each do |n|
next if n % 2 == 0 || n % 3 == 0 || n % 5 == 0
(2..((n**0.5).to_i)).each do |m|
break if n % m == 0
counter += 1 if m == (n**0.5).to_i
end
p Time.now - start if counter == num
return n if counter == num
end
end
答案 0 :(得分:0)
我不知道红宝石,但看起来你正在使用试验分区找到素数,即,对于每个数字(计数器),你正在检查它是否可被任何数字整除,直到该数字的平方根
请改用Sieve of Erastothenes。基本上,当您找到素数时,向前看并将每个素数的所有倍数标记为复合。未标记为复合的下一个数字是素数。
如果您选择将倍数标记为极限n,则只需将素数的倍数标记为sqrt(n)。
我之前在项目euler的python中解决了this same problem,其中问题语句需要10,001个素数。和你一样,我从试验部门开始,发现我的程序难以忍受。