我正在尝试在项目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除数)。真的加快了我的运行时间,我得到了答案。哇噢!