为了加快我的计划,我正在尝试将这两种方法结合起来,但是我最难做到这一点。以下是方法:
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
答案 0 :(得分:2)
以下是您当前方法的简化:
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
的平方。更好的是sieve方法,特别是增量方法。
答案 1 :(得分:0)
我实际上会使用这段代码,而不是将两个函数组合在一起:
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秒