【问题标题】:Ruby and bignum issue with OSX terminalOSX 终端的 Ruby 和 bignum 问题
【发布时间】:2014-12-31 20:44:26
【问题描述】:

我正在学习 Ruby,并且正在通过 Project Euler 解决这个问题。当我尝试通过终端运行我的 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)

【问题讨论】:

  • 在这里发布你的代码怎么样?
  • 谢谢皮蒂。我用粘贴的代码编辑了我的问题。
  • 它的工作。只是要经过很多数字,2...600851475143 是一个相当大的范围。在你的(2...num).each 行后面加上puts "checking #{p}",你就会明白我的意思了。
  • 感谢皮蒂的帮助!

标签: ruby macos terminal


【解决方案1】:

Project Euler 背后的理念是构建有效的算法,否则执行将花费太多时间或资源 - 这就是您的情况。看看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

这不是检测素数最有效的方法,但它是满足您需求的最简单有效的方法之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多