三角形数序列是由对自然数的连加构造而成的。所以第七个三角形数是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是第一个拥有超过5个约数的三角形数。
那么第一个拥有超过500个约数的三角形数是多少?
def get_divisors(x):
"""
获取x的约数
若 x = x1 * x2,则x的约数为x1和x2的组合
"""
x_s = {1, x}
x_sqrt = int(pow(x, 0.5))
for x1 in range(2, x_sqrt + 1):
if x % x1 == 0:
if x1 not in divisors_dict:
get_divisors(x1)
x1_s = divisors_dict[x1]
x1_s.add(x1)
x2 = x // x1
if x2 not in divisors_dict:
get_divisors(x2)
x2_s = divisors_dict[x2]
x2_s.add(x2)
for i1 in x1_s:
for i2 in x2_s:
x_s.add(i1 * i2)
break
divisors_dict[x] = x_s
return x_s
n = 500
triangle_num = 1
i = 1
divisors_dict = dict()
while 1:
i += 1
triangle_num += i
if len(get_divisors(triangle_num)) > n:
break
print(triangle_num)