欧拉计划 61

三角形数,四角形数,五角形数,六角形数,七角形数和八角形数都是定形数,他们分别由以下公式产生:

三角形数 P3,n=n(n+1)/2 1, 3, 6, 10, 15, …
四角形数 P4,n=n**2 1, 4, 9, 16, 25, …
五角形数 P5,n=n(3n−1)/2 1, 5, 12, 22, 35, …
六角形数 P6,n=n(2n−1) 1, 6, 15, 28, 45, …
七角形数 P7,n=n(5n−3)/2 1, 7, 18, 34, 55, …
八角形数 P8,n=n(3n−2) 1, 8, 21, 40, 65, …
三个四位数形成的有序集合: 8128, 2882, 8281,有三个有趣的性质:

这个集合是循环的:每个数的后两位数是下一个数的前两位数,包括第三个和第一个的关系。
三种定形数中的每一种都能被这三个数中的一个不同的数代表:
三角形数 (P3,127=8128), 四角形数 (P4,91=8281), 和五角形数 (P5,44=2882)。
这是唯一具有以上性质的四位数的集合。
找出唯一的一个六个四位数的循环集合,使得从三角形数到八角形数中的每一种都能由该集合中的一个不同的数代表。

求这个集合中元素之和。

def is_cyclic(p, pl):
    """ 
    递归
    遍历查找,首尾相接
    """
    if len(pl) == 0:
        if p[-1][-1] == p[0][0]:
            return p
        else:
            return None
    for pl_ in pl:
        for pl_p in pl_:
            if p[-1][-1] == pl_p[0]:
                p_copy = p.copy()
                pl_copy = pl.copy()
                p_copy.append(pl_p)
                pl_copy.remove(pl_)
                ps = is_cyclic(p_copy, pl_copy)
                if ps:
                    return ps
    return None


# 归纳定形数公式
pi_list = []
for i in range(3, 9):
    pi = []
    for n in range(150):
        v = n * ((i - 2) * n + (4 - i)) / 2
        if v >= 1000 and v <= 10000 and v % 100 > 9:
            pi.append((v // 100, v % 100))
    pi_list.append(pi)

for p8 in pi_list[-1]:
    s = is_cyclic([p8], pi_list[:-1])
    if s is not None:
        break
print(sum([i * 100 + j for i, j in s]))                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值