墨水污染的数列

某页纸上有一个数列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)