刚才学弟问,不好意思说不知道康托逆展开是个什么东西= =。然后硬着头皮百度了一下,找到了思路,顺手就敲了一下,发上来吧:
求n个数的第m大的全排列。
思路链接:
代码贴出来 :简单的写下注释。。0.0
1 #include <iostream> 2 using namespace std; 3 const int MAXN = 13; 4 int num[MAXN]; 5 int jie[12]={1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800};//阶乘存起来省的写函数计算了 6 void init() 7 { 8 for (int i = 0; i < MAXN; ++i) 9 { 10 num[i]=i; 11 } 12 } 13 void kt_sequence(int n,int m) 14 { 15 if(n<1)return; 16 int x=m-1; 17 int a,b,i; 18 a=x/jie[n-1]; 19 b=x%jie[n-1]; 20 int temp=0; 21 for(i=0;i<MAXN;++i) //有a个数比他小的数的位置求出来 22 { 23 if(temp==a+1)break; 24 if(num[i]!=0)temp++; 25 } 26 cout<<num[i-1]; 27 28 num[i-1]=0; //记得输出过的数要标记下,剔除 29 30 kt_sequence(n-1,b+1); 31 32 } 33 int main() 34 { 35 int n,m; 36 37 while(cin>>n>>m) 38 { 39 init(); //num数组存n个数,方便求位置 40 41 kt_sequence(n,m); 42 cout<<endl; 43 } 44 return 0; 45 }