Python 1-9构成3个成加和关系的三位数的计算

题目:将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))

返回结果,检验了下,没出现重复。:

猜你喜欢

转载自blog.csdn.net/qq_24499417/article/details/85043414
今日推荐