【问题标题】:Ruby project Euler #12 efficiencyRuby 项目 Euler #12 效率
【发布时间】:2015-05-04 17:08:37
【问题描述】:

我正在尝试在项目 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 是第一个三角形数 超过五个除数。 第一个有五百多个除数的三角形数的值是多少?

我已经写出了我“认为”在 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 个除数)。

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

【问题讨论】:

标签: ruby performance optimization runtime


【解决方案1】:

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

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

【讨论】:

  • 这应该是一条评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
相关资源
最近更新 更多