题目:https://projecteuler.net/problem=43
分析:数据量不大,一共也就10! = 3628800种排列,枚举即可,这里有几个可以优化的地方:
(1)0不能出现在数字的首位,所以枚举时从1为开头即可
(2)对容易剪枝的条件先判断,例如d2d3d4能被2整除,则d4必须是偶数,这样一半的情况下后面的if都不用算了;对于d4d5d6能被5整除,则d6必须是5或者0,这样后面的if也不用算了
from itertools import permutations as Permute
def AsNumber(lis):
n = 0
for d in lis:
n = n * 10 + d
return n
seq = [1, 0] + list(range(2, 10))
res = 0
for arr in Permute(seq, 10):
if arr[3] & 1:
continue
if arr[5] != 5 and arr[5] != 0:
continue
if sum(arr[2:5]) % 3 or AsNumber(arr[4:7]) % 7 or AsNumber(arr[5:8]) % 11 or \
AsNumber(arr[6:9]) % 13 or AsNumber(arr[7:]) % 17:
continue
res += AsNumber(arr)
print(res)