欧拉计划 12

三角形数序列是由对自然数的连加构造而成的。所以第七个三角形数是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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值