我正在学习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)
答案 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
它不是最有效的质数检测方法,但它是满足您需求的最简单有效的方法之一。