题目:将1到9共9个数字构成3个3位数,刚好占用完1-9这九个数字。即:x+y=z(x,y,z均为>=100且<1000的三位数。且x,y,z刚好用完1到9这9个数字).
我的思路。按照不重复的情况,假定x<y。则x<y<x+y=z<1000。2*x<x+y<1000,那么x<500的。我先抽取x这个三位数。
def xint():
s=[]
for i in range(1,5):
for j in range(1,10):
for k in range(1,10):
if i!=j and j!=k and i!=k:
s.append([i,j,k])
然后在1-9里面排除掉x里面的三个数,就从剩下的6个里面抽第二个三位数y。函数里的n代表第一个数x的3位数的list.
def yint(n:list):
s=[]
for i in range(n[0]+1,9):
for j in range(1,10):
for k in range(1,10):
if i!=j and j!=k and i!=k and len({i,j,k}& set(n))==0:
s.append([i,j,k])
x+y都抽完了,那么z没得抽了。剩余3个数固定了,只能做数学排序了。最后检验x+y==z是否成立就可以返回结果了。
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 16 15:01:31 2018
@author: Fanxiaolei
"""
import itertools
import time
t=time.clock()
l=sorted(range(1,10))
res=[]
def xint():
s=[]
for i in range(1,5):
for j in range(1,10):
for k in range(1,10):
if i!=j and j!=k and i!=k:
s.append([i,j,k])
return s
def yint(n:list):
s=[]
for i in range(n[0]+1,9):
for j in range(1,10):
for k in range(1,10):
if i!=j and j!=k and i!=k and len({i,j,k}& set(n))==0:
s.append([i,j,k])
return s
a=xint()
for x in a:
x1=x[0]*100+x[1]*10+x[2]
b=yint(x)
for y in b:
c=(set(x)|set(y))^set(l)
y1=y[0]*100+y[1]*10+y[2]
m=itertools.permutations(c,3)
for z in m:
z1=z[0]*100+z[1]*10+z[2]
if x1+y1==z1:
res.append('%d+%d=%d'%(x1,y1,z1))
print(res,'\n耗费时间:%f'%(time.clock()-t))
返回结果,检验了下,没出现重复。: