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])))