我正在解决一些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)
答案 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左右。预计计算时间需要数年。您应该更改算法,以便渐近复杂度降低