本帖最后由 bacon6581 于 2016-8-19 12:06 编辑 from time import time
start=time()
a=set()
result=0
#用的是穷举法,即先获取每一个9位数,再去判断是否属于pandigital 组合
#P9取9 即9!=362880种取法
#第一位数字有9种取法(1-9)
#取出来的数字放在列表‘c’里(这时c里只有刚放进来的一个数字)
for i1 in range(0,9):
b=[1,2,3,4,5,6,7,8,9]
c=[]
c.append(b.pop(i1))
b1=b[:]
c1=c[:]
#第二位数字有8种取法(第一位数字已取走的那个数字,就不能再取了)
#取出来的数字放在列表‘c’里(这时c里有两个数字了)
for i2 in range(0,8):
b=b1[:]
c=c1[:]
c.append(b.pop(i2))
b2=b[:]
c2=c[:]
#第三位数字有7种取法(第一、二位数字已取走的那个数字,就不能再取了)
#取出来的数字放在列表‘c’里(这时c里有三个数字了)
#下同
for i3 in range(0,7):
b=b2[:]
c=c2[:]
c.append(b.pop(i3))
b3=b[:]
c3=c[:]
for i4 in range(0,6):
b=b3[:]
c=c3[:]
c.append(b.pop(i4))
b4=b[:]
c4=c[:]
for i5 in range(0,5):
b=b4[:]
c=c4[:]
c.append(b.pop(i5))
b5=b[:]
c5=c[:]
for i6 in range(0,4):
b=b5[:]
c=c5[:]
c.append(b.pop(i6))
b6=b[:]
c6=c[:]
for i7 in range(0,3):
b=b6[:]
c=c6[:]
c.append(b.pop(i7))
b7=b[:]
c7=c[:]
for i8 in range(0,2):
b=b7[:]
c=c7[:]
c.append(b.pop(i8))
#前面8个数字都确定了,那最后一位只有一种取法了:P1取1=1
#直接把剩余的一个数字,放入列表‘c’里边
c.append(b[0])
#产生pandigital 组合的只可能会是以下4种情况:
#1位数 * 4位数 = 5位数
#2位数 * 3位数 = 5位数
#4位数 * 1位数 = 5位数
#3位数 * 2位数 = 5位数
#如果有123456789组合,则必有234516789组合
#即1*2345==5678(第一个组合的第一种判断) 与2345*1==5678(第二个组合的第3种判断)属重复判断
#故注释掉后两种判断
#判断成立,即该数值属pandigital 组合,并将结果放入集合'a'中(不用操心会有重复值)
if(((c[0]*(c[1]*1000+c[2]*100+c[3]*10+c[4]))==c[5]*1000+c[6]*100+c[7]*10+c[8])
or ((c[0]*10+c[1])*(c[2]*100+c[3]*10+c[4])==c[5]*1000+c[6]*100+c[7]*10+c[8])):
#or ((c[0]*100+c[1]*10+c[2])*(c[3]*10+c[4])==c[5]*1000+c[6]*100+c[7]*10+c[8])
#or ((c[0]*1000+c[1]*100+c[2]*10+c[3])*(c[4])==c[5]*1000+c[6]*100+c[7]*10+c[8])):
a.add(c[5]*1000+c[6]*100+c[7]*10+c[8])
#将集合a里的所有数值累加一遍,即所求之结果!
for k in a:
result+=k
print(result)
print(time()-start)
>>> ================================ RESTART ================================
>>>
45228
22.254349946975708
>>> ================================ RESTART ================================
>>>
45228
15.573134183883667
>>>
中文注释后加的,要是注释有报错,麻烦版主删掉再试!
注释掉两行,速度快了7秒
|