某页纸上有一个数列A。A包含了按照从小到大顺序排列的多个自然数,但是因为一些原因,其中有一些连续的位置(个数为M)看不清了。其中,左边最小的数是X,右边最大的数为Y。这些数符合累加在P和Q之间,大于等于P,小于等于Q,请写程序在输入M,X,Y,P,Q后自动给出所有可能的合法排列。
基本思路:1.生成所有可能的排列。 2.判断这些排列是否合法。
详细过程:数列的有序性提示我们可以用列表来处理此问题。不难想到,由此M个元素构成的集合必然是[x,y](x,y∈N*)的子集。因此,可以先构造出全集[x+1,y-1],使用排列组合工具迭代产生所有含M个元素的组合,然后利用sum求和判断是否处于[p,q]区间即可。
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import itertools m = 2 x = 1 y = 6 p = 8 q = 10 inkypart = [i for i in range(x+1,y)] #生成x和y之间所有的自然数 print('All possible combinations are: ') for i in itertools.combinations(inkypart,m): #用排列组合方法,迭代产生所有包含m个元素的子集 if p <= sum(i) <= q: #判断此元组元素的和是否在[p,q]区间 i = list(i) #将元组转化为列表 i.insert(0,x) #将x和y加入列表 i.append(y) print(i) |