欧拉计划 43

1406357289是一个pandigital数,因为它包含了0到9之间每个数字且只包含了一次。此外它还有一个有趣的子串整除性质。

令d1表示其第一位数字,d2表示第二位,以此类推。这样我们可以得到:
d2d3d4=406 能被 2 整除
d3d4d5=063 能被 3 整除
d4d5d6=635 能被 5 整除
d5d6d7=357 能被 7 整除
d6d7d8=572 能被 11 整除
d7d8d9=728 能被 13 整除
d8d9d10=289 能被 17 整除
求所有具有如上性质的0到9pandigital数。

import itertools


# 判断各位上可能出现的值
d_set = set(range(10))
d1_set = set(range(1, 10))
d4_set = set(range(0, 10, 2))
d6_set = {0, 5}

for d6 in d6_set:
    for d4 in d4_set - {d6}:
        for d1 in d1_set - {d4, d6}:
            for d_7 in itertools.permutations(d_set - {d1, d4, d6}, 7):
                d2, d3, d5, d7, d8, d9, d10 = d_7
                if (d3 + d4 + d5) % 3 == 0:
                    if (d5 * 100 + d6 * 10 + d7) % 7 == 0:
                        if (d6 * 100 + d7 * 10 + d8) % 11 == 0:
                            if (d7 * 100 + d8 * 10 + d9) % 13 == 0:
                                if (d8 * 100 + d9 * 10 + d10) % 17 == 0:
                                    print(''.join(map(str, [d1, d2, d3, d4, d5, d6, d7, d8, d9, d10])))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值