为了加快我的程序速度,我尝试将这两种方法结合起来,但却遇到了最困难的时刻。以下是一些方法:
def prime?(number, array)
array.each do |x|
if number % x == 0
return false
end
end
true
end
def sum_prime_2(number)
i = 0
prime = 1
output = [2]
while prime < number
if prime?(prime, output)
i += 1
output << prime if prime != 1
end
prime += 2
end
output.inject(:+)
end这是我想出来的,但效果不太好。我想要任何帮助。
def sum_prime(number)
i = 0
prime = 1
output = [2]
while prime < number
if output.each { |x| prime % x == 0 } == true # prime? method
output << prime if prime != 1
i += 1
end
prime += 2
end
output.inject(:+)
end发布于 2013-12-04 03:10:39
以下是您当前方法的简化:
def sum_primes(limit)
primes = [2]
n = 3
while n < limit
primes << n if primes.all? { |p| n % p != 0 }
n += 2
end
primes.inject(:+)
end但你可以做得更好。例如,没有必要检查所有先前素数的可分性--只到n的平方。更好的方法是筛,筛方法,特别是增量方法。
发布于 2013-12-04 03:28:00
我将实际使用这段代码,而不是将这两个函数组合在一起:
def prime?(number, array)
array.each do |x|
if number % x == 0
return false
end
return true if x * x > number
end
true
end对sum_prime_2(100000)和FMc的答案和我的答案做一个快速的基准测试,原始代码大约需要5.0秒,FMc需要6.5秒,但是我的版本只需0.1秒。
https://stackoverflow.com/questions/20365921
复制相似问题