PE-43(枚举)

来源:互联网 发布:淘宝下单不付钱 编辑:程序博客网 时间:2024/06/06 01:34

题目: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 Permutedef AsNumber(lis):n = 0for d in lis:n = n * 10 + dreturn nseq = [1, 0] + list(range(2, 10))res = 0for arr in Permute(seq, 10):if arr[3] & 1:continueif arr[5] != 5 and arr[5] != 0:continueif 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:continueres += AsNumber(arr)print(res)


0 0
原创粉丝点击