Ruby 欧拉项目 #12 效率

Ruby project Euler #12 efficiency

我正在尝试解决项目 euler 的问题 #12(请参阅下面的引用)

The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:

1、3、6、10、15、21、28、36、45、55、...

让我们列出前七个三角数的因数:

1:1 3:1,3 6:1,2,3,6 10:1,2,5,10 15:1,3,5,15 21:1,3,7,21 28 : 1,2,4,7,14,28 我们可以看到 28 是第一个有 超过五个除数。 第一个有超过五百个因数的三角数是多少?

我已经写出了我 "think" 在 Ruby 中的有效解决方案,但是运行时间非常慢。请参阅下面的代码:

    def num_divisors_of(num)
  sum = 0
  for i in 1..num/2 do
    if num % i == 0 then sum += 1 end
  end
  return sum += 1
end

currentSum = 0

for i in 1..10000 do
  currentSum += i
   if num_divisors_of(currentSum) > 500
     puts currentSum
   break
   end
end

基本上,我从 1 开始,将其加到 运行 总数中,然后检查该总数的除数。如果人数超过 500,我将停止并 return 人数。

我想知道是否有另一种我还没有想到的方式来看待这个问题?我想过寻找质因数(我很确定我找到一个数字的除数数量的方法让我陷入困境),但除此之外我真的不知道在哪里可以提高效率。

有thoughts/ideas吗?

编辑:好的,我找到了一种节省运行时间的方法。在搜索除数时,我一直查找到数字的平方根,每次找到一个除数时加 2(例如:对于 625 的除数,我找到 5。5 * 125 = 625,所以这些是 2 个除数).接下来,如果平方根是一个精确的除数,则删除 1(因为我会计算两次。例如,25 * 25 = 625,但那只是 1 个除数)。

真的加快了我的运行时间,我得到了答案。哇哦!

看看这个答案: All factors of a given number

然后您只需计算数组中元素的数量,直到找到一个除数超过 500 的数组。