此代码查找具有500个除数的第一个素数。当我运行它时,它工作,但我被告知“Prime :: new已经过时了。使用Prime的Prime :: instance或类方法。”
我认为这意味着我可以用'Prime.instance'替换'Prime.new',但是当我这样做时,我被告知'接下来是一种未定义的方法'。由于素数应该是一个枚举器,为什么我会收到这个错误?这个正确的答案是76576500。
require 'mathn'
primer = Prime.new
primes = [ primer.next ]
seed = 500
n = (seed * (seed + 1)) / 2
i = seed + 1
def count_prime_factors primer, primes, n
total = 1
max = Math.sqrt(n).to_i
while primes.last < max
primes << primer.next
end
primes.each do |i|
count = 0
while n % i == 0
n = n / i
count += 1
end
if count > 0
total *= count + 1
end
end
total
end
while(count_prime_factors(primer, primes, n) < seed)
n += i
i += 1
end
puts n
答案 0 :(得分:3)
尝试将Prime.new
替换为Prime.instance
,将primes.next
的每个实例替换为primes.succ
。
见the source code for the Prime
class。您会发现Prime.next
别名为Prime.succ
,但Prime.next
本身没有实现。根据您创建Prime
实例的方式,行为会发生一些变化,这就是您在上面遇到不同错误的原因。
答案 1 :(得分:2)
目前,您应该使用Prime::EratosthenesGenerator.new
代替Prime.new
(红宝石2.2 +)