这段代码找到第一个有500个除数的素数。当我运行它时,它工作了,但是我被告知“prime::new已经过时了。使用prime::prime的实例或类方法。“
我认为这意味着我可以用Prime.instance替换Prime.new,但是当我这样做的时候,我被告知“next是一个未定义的方法”既然prime应该是一个枚举器,为什么我会得到这个错误?正确答案是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

最佳答案

尝试用Prime.new替换Prime.instance,用primes.next替换每个primes.succ实例。
the source code for the Prime class。您会发现Prime.next被别名为Prime.succ,但Prime.next本身没有实现行为会根据创建Prime实例的方式发生一些变化,这就是为什么上面会出现不同的错误。

关于ruby - Prime.new已过时-如何重写此代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22721356/

10-12 19:57