華電北風吹
最後修改日期: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...