我正在尝试解决 Project 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 提出的解决方案:
triangle_number = 1
(2..9_999_999_999_999_999).each do |i|
triangle_number += i
num_divisors = 2 # 1 and the number divide the number always so we don't iterate over the entire sequence
(2..( i/2 + 1 )).each do |j|
num_divisors += 1 if i % j == 0
end
if num_divisors == 500 then
puts i
break
end
end
我不应该使用像 9_999_999_999_999_999 这样的任意大数字。如果我们有像某些函数式语言那样的 Math.INFINITY 序列会更好。如何在 Ruby 中生成惰性无限序列?