题目:
We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once; for example, the 5-digit number, 15234, is 1 through 5 pandigital.
The product 7254 is unusual, as the identity, 39 186 = 7254, containing multiplicand, multiplier, and product is 1 through 9 pandigital.
Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through 9 pandigital.
HINT: Some products can be obtained in more than one way so be sure to only include it once in your sum.
思路:
没思路,死算呗:
import datetime
def getSet(num):
return set(str(num))
def getmaxnum(inset):
sortlist=list(inset)
sortlist.sort(reverse=True)
return int(''.join(sortlist))
start_time=datetime.datetime.now()
set1= set(str(x) for x in range(1,10))
li=[]
#end_time=datetime.datetime.now()
intlist=[ x for x in xrange(10000) if x%10>=2 and len(str(x))==len(set(str(x)))]
for index,i in enumerate(intlist):
for j in intlist[index:]:
if not getSet(i)&getSet(j):
product=i*j
if getSet(product)==set1-getSet(i)-getSet(j):
li.append((i,j,product))
print sum([item[2] for item in li])
end_time=datetime.datetime.now()
print end_time-start_time
运算结果:
137023200
0:00:26.857000
0:00:26.857000
但是结果还是错了。
原因:
1.我没有排除掉i,j里可能含有0的选项。
2.我没有排除product可能含有重复选项。
更改如下:
45228
0:00:09.460000
原因:
1.我没有排除掉i,j里可能含有0的选项。
2.我没有排除product可能含有重复选项。
更改如下:
#coding=utf-8
import datetime
def getSet(num):
return set(str(num))
def getmaxnum(inset):
sortlist=list(inset)
sortlist.sort(reverse=True)
return int(''.join(sortlist))
start_time=datetime.datetime.now()
set1= set(str(x) for x in range(1,10))
li=[]
#end_time=datetime.datetime.now()
intlist=[ x for x in xrange(10000) if '0' not in str(x) and x%10 not in (1,5) and len(str(x))==len(set(str(x)))]
for index,i in enumerate(intlist):
for j in intlist[index+1:]:
if not getSet(i)&getSet(j):#i,j不含有相同的数字
product=i*j
if product<1000:
continue
if len(str(product))== len(set(str(product))) and getSet(product)==set1-getSet(i)-getSet(j):#product没有重复数字,且product,i,j的全集构成pandict
li.append((i,j,product))
运行结果:
45228
0:00:09.460000
缺点,太慢了,要10秒钟。
改了好久也改不到1秒以下。
最终代码:
(4, 1738, 6952)
(4, 1963, 7852)
(12, 483, 5796)
(18, 297, 5346)
(27, 198, 5346)
(28, 157, 4396)
(39, 186, 7254)
(42, 138, 5796)
(48, 159, 7632)
45228
0:00:00.712000
改了好久也改不到1秒以下。
最终代码:
#coding=utf-8
import datetime
def getSet(num):
return set(str(num))
def getmaxnum(inset):
sortlist=list(inset)
sortlist.sort(reverse=True)
return int(''.join(sortlist))
start_time=datetime.datetime.now()
set1= set(str(x) for x in range(1,10))
li=[]
#end_time=datetime.datetime.now()
intlist=[ x for x in xrange(5000) if '0' not in str(x) and x%10 not in (1,5) and len(str(x))==len(set(str(x)))]
marked={item:False for item in intlist}
for index,i in enumerate(intlist):
for j in intlist[index+1:]:
if not getSet(i)&getSet(j):#i,j不含有相同的数字
product=i*j
tempstr=str(i)+str(j)
productstr=str(product)
if '0' in productstr or len(tempstr+productstr)<9 :
continue
if len(tempstr+productstr)>9:
break
if set(tempstr+productstr)==set('123456789'):#product没有重复数字,且product,i,j的全集构成pandict
li.append((i,j,product))
for item in li:
print item
print sum({ item[2] for item in li})
end_time=datetime.datetime.now()
print end_time-start_time
运行结果:
(4, 1738, 6952)
(4, 1963, 7852)
(12, 483, 5796)
(18, 297, 5346)
(27, 198, 5346)
(28, 157, 4396)
(39, 186, 7254)
(42, 138, 5796)
(48, 159, 7632)
45228
0:00:00.712000