Ruby项目Euler#12效率

时间:2015-03-03 21:22:09

标签: ruby performance optimization runtime

我正在尝试在项目euler上做问题#12(见下面的引用)

  
    

通过添加自然数来生成三角数的序列。所以第7个三角形数字是1 + 2 + 3 + 4 + 5 + 6 + 7     = 28.前十个术语是:

  
     

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是第一个三角形数   五个以上的除数。   具有超过500个除数的第一个三角形数的值是多少?

我已经写出了“我认为”是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,我会停止并返回该号码。

我想知道是否还有另一种方式来看待我尚未想到的?我一直在想找到素数因子(我很确定我的方法是找到一个数字的除数是什么让我失望),但除此之外我真的不知道哪里可以让它更有效率。

有什么想法/想法吗?

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

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

1 个答案:

答案 0 :(得分:1)

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

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