我正在学习 Ruby,正在通过此问题研究项目欧拉当尝试通过回答终端运行 Ruby 文件时,它只是停滞 (没有错误消息,但只是提出像思想一样的空白)。我假设这这么大数量的计算问题。我已尝试复制并粘贴到 repl.it,我的代码,但提出了此错误消息︰

(eval): 12: (eval): 12︰ 负分配大小 (或太大) (NoMemoryError)

是否有任何办法可以避免这通过终端 (或任何其他建议)?谢谢。

编辑 (在我的代码中添加)︰

#3. Largest prime factor
#The prime factors of 13195 are 5, 7, 13 and 29.

#What is the largest prime factor of the number 600851475143 ?



def largest_prime(num)
  all_primes = []
  (2...num).each do |p|
    if (num % p == 0) && (is_prime?(p))
      all_primes << p
    end
  end
  all_primes.sort!
  puts all_primes.last
end


def is_prime?(number)
  (2...number).each do |x|
    if number % x == 0
      return false
    else
      next
    end    
  end
  true
end

puts largest_prime(600851475143)
2014-12-31 00:00:00
问题评论:

如何在此处发布代码?

谢谢 Petey。我与我的代码粘贴在编辑我的问题。

它的工作。只是许多数字易于浏览, 2...600851475143是一个相当大的范围。引发后puts "checking #{p}"(2...num).each行,您将会看到什么 i 平均值。

Petey 的帮助,谢谢 !

回答:

欧拉项目背后的理念是建立有效的算法,否则只是执行太多的时间和资源-这是您的案例。看看primality_test wiki 文章,您就会明白,为什么不应检查(2...number)和为什么(2..Math.sqrt(num))就足够了。我没有运行您的代码,但建议您可以提高您is_prime?方法首先 (顺便说一句,您不应该您方法作为名称的前缀与is_当您最后有问号)︰

def prime?(num)
  return false if num == 0 || num == 1
  (2..Math.sqrt(num).to_i).each do |i|
    return false if num % i == 0
  end
  true
end

它不是最有效的素数检测方法,但其一种最简单的形式和有效足够满足您的需要。

为此感谢 Rustam,超级有用的 !

内容来源于Stack Overflow Ruby and bignum issue with OSX terminal
请输入您的翻译

Ruby and bignum issue with OSX terminal

确认取消