Ruby解决方案中的Project Euler 3超时

Ruby解决方案中的Project Euler 3超时,ruby,Ruby,我将通过一些Euler项目的问题来练习使用Ruby解决问题。我为问题3提出了以下解决方案,虽然它适用于较小的数字,但对于较大的数字,它似乎永远不会返回值。这是因为和Bignum有关吗?有人能告诉我为什么会超时,以及更好的解决问题的方法,最好是通过推理/了解幕后发生的事情。我在努力理解 欧拉项目问题: 13195的主要因子为5、7、13和29。 数字600851475143中最大的素因子是什么 我的解决方案: def primecheck(number) (2...number).each {

我将通过一些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)

它正在处理从1到600851475143的所有数字。它还检查所有数字是否为素数。因此,操作总数为^3/2,大约为10^18。预计需要数年的时间来计算。您应该更改算法,使渐近复杂性降低

它将遍历从1到600851475143的所有数字。它还检查所有数字是否为素数。因此,操作总数为^3/2,大约为10^18。预计需要数年的时间来计算。您应该更改算法,使渐近复杂性降低提示:一旦找到素数因子,就可以除以它。这大大减少了必须检查的剩余潜在除数的范围

使用第一个示例:

13195/5 = 2639,
2639/7  = 377,
377/13  = 29,
29/29   = 1, done.
这样,我们只需要检查29个,而不是一直检查到13195个

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

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

使用第一个示例:

13195/5 = 2639,
2639/7  = 377,
377/13  = 29,
29/29   = 1, done.
这样,我们只需要检查29个,而不是一直检查到13195个


有一些方法可以进一步改进它,但仅此优化就足以解决这个简单的问题。

您能帮我理解您的逻辑吗?我的脑子有点笨这个提示的一个补充是,一旦你找到一个除数,例如5,你可以继续从那个除数开始,事实上你需要重复除法,直到它不再是减少数的一个因子。这样你就不需要回去重新检查下除数了。对素数的缓慢检查也是多余的——如果你按照这个答案的建议反复进行除法,并按顺序处理数字,你将永远找不到非素数除数,因此你不需要检查素数。你能帮我理解你的逻辑吗?我的脑子有点笨这个提示的一个补充是,一旦你找到一个除数,例如5,你可以继续从那个除数开始,事实上你需要重复除法,直到它不再是减少数的一个因子。这样你就不需要回去重新检查下除数了。对素数的缓慢检查也是多余的——如果你按照这个答案的建议反复进行除法,并按顺序处理数字,你将永远找不到非素数除数,因此你不需要检查primeness@hammar除非Ruby是VB,否则他只检查素数的除数,所以它是开的。@hammar除非Ruby是VB,他只检查除数的素性,所以它是开着的。