輸出排列的第n個數

2021-07-04 02:22:44 字數 1649 閱讀 3118

華電北風吹

最後修改日期:2015/8/6

輸入:乙個整數n和乙個字串鍊錶(預設鍊錶已經由小到大排序好,例如[1,2,3,4,5,6],(這個主要是用來計算排列組合次序的,並不是嚴格的排序,但是是預設的順序也行,例如[a,b,c,1,2,3])

輸出:輸入鍊錶從最小的排列(輸入排列預設是最小的)開始的第n個排列

中間使用到三個函式

def

func1

(x):

i=1val=1

while val1

val*=i

if val==x:

return (1,i,0)

else:

step=val//i

k=x//step

return (k,i-1,x%(k*step))

func1函式主要功能輸出x的階乘範圍。例如 func1(126)返回(1,5,6)表示

126=1∗

5!+6

def

func2

(x):

lst=

result=func1(x)

while result[2]!=0:

result=func1(result[2])

return lst

func2主要返回乙個鍊錶,把

x 分解成幾個階乘的和。例如func2(126)返回[(1,5),(1,3)]表示

126=1∗

5!+1

∗3!

result=

count=len(clst)

lst=func2(x)

length=len(lst)

for i in range(0,length):

if idelta=lst[i][0]

position=lst[i][1]+1

while

count>position:

del clst[-count]

count-=1

del clst[-position+delta]

count-=1

else:

delta=lst[i][0]-1

position=lst[i][1]+1

while

count>position:

del clst[-count]

count-=1

del clst[-position+delta]

count-=1

while

count>0:

del clst[-1]

count-=1

return

result

func3是主函式,主要呼叫func2返回的鍊錶,根據選擇規則在傳入的字串鍊錶中選擇出第n個排列。

測試**:

charlist=[0,1,2,3,4,5,6,7,8,9]

k=pow(10,6)

print(func1(k))

print(func2(k))

print(func3(k,charlist))

主程式輸出:

[2,7,8,3,9,1,5,4,6,0]

需要注意的是程式沒有越界檢測,越界會報錯

N個數的全排列

我採用的方法是類似密碼箱的轉輪來得到所有的排列組合 比如求 1,2,3,4的所有排列組合 採用遞減式輪轉來生成 n 4 以1234為初始值 得到如下的所有4個組合,放入最終的容器中 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 n 3 以上面的四個作為初始值,在第三位開始輪轉 得到...

求n個數的排列

如果給定n個不同字元,將這n個字元全排列,最終的結果將會是n 種。如 給定 a b c三個不同的字元,則結果為 abc acb bac bca cab cba一共3 3 2 6種情況。public class test6 public static void count vectorv1,vecto...

n全排列輸出和 n個數的組合 數字範圍a b

n全排列輸出 int wpermutation int num,bool brepeat num表示num全排列 brepeat標誌是否產生重複元素的序列。int permutation int n,int a,int cur,bool brepeat printf n else if ok ret...