Ruby解决方案中的项目Euler#3超时

时间:2013-05-10 02:37:10

标签: ruby

我正在解决一些Project Euler问题,以便使用Ruby来解决问题。我想出了问题3的以下解决方案,虽然它适用于较小的数字,但它似乎永远不会返回较大数字的值。这是因为与Bignum有关吗?有人可以向我描述为什么它会超时,以及解决这个问题的更好方法(最好有关于幕后发生的事情的推理/信息。我正在努力理解

项目欧拉问题:

13195的主要因素是5,7,13和29。 600851475143的最大主要因素是什么?

我的解决方案:

def primecheck(number)
  (2...number).each { |x| return false if number % x == 0}
  true
end

def largestprime(number1)
  factors = []
    (1..number1).each do |i|
      if number1 % i == 0 && primecheck(i)
        factors << i
      end
    end
puts "The answer is #{factors.last}"
end

largestprime(600_851_475_143)

2 个答案:

答案 0 :(得分:10)

提示:一旦找到了一个素数因子,就可以除以它。这大大减少了你必须检查的剩余潜在除数的范围。

使用你的第一个例子:

13195/5 = 2639,
2639/7  = 377,
377/13  = 29,
29/29   = 1, done.

这样,我们只需要检查29而不是一直到13195。

有一些方法可以进一步改进它,但仅此优化对于这个简单的问题来说应该足够了。

答案 1 :(得分:4)

它将通过从1到600851475143的所有数字。它还检查数字是否为素数,对于所有数字。因此操作总数为O(n ^ 3/2),应该在10 ^ 18左右。预计计算时间需要数年。您应该更改算法,以便渐近复杂度降低