【发布时间】: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