OSX终端的Ruby和bignum问题

时间:2014-12-31 20:44:27

标签: ruby macos terminal

我正在学习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)

1 个答案:

答案 0 :(得分:2)

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

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