No_32:Pandigital products

题目:

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
但是结果还是错了。
原因:
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秒以下。
最终代码:
#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值