您的位置:首页 > 其它

PE-43(枚举)

2015-09-10 00:58 471 查看
题目: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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: