/* mbinary ######################################################################### # File : permute_cantor.c # Author: mbinary # Mail: zhuheqin1@gmail.com # Blog: https://mbinary.xyz # Github: https://github.com/mbinary # Created Time: 2018-11-17 11:25 # Description: ######################################################################### */ #include //使用康托展开计算全排列, 下面存储的是0!,1!,2!...(n-1)! long long int fac[100]={}; void calFac(int n) { int i; fac[0]=1; for(i=1;i<=n;i++){ fac[i]=i*fac[i-1]; } } void permute(int *arr,int n,int sum) { /*sum表示全排列由小到大排序后的名次,从0 开始计数, 由名次求出 n位的排列存储到 arr 中*/ int i,j,ct=0,k, ct2; int flag[n]; for(i=0;i=0;i--){ for(j=i;j>=0;j--){ if(j*fac[i]<=sum){ ct2=0; for(k=0;kj)break; } arr[ct++] = k; flag[k]=0; sum -=j*fac[i]; break; } } } } void printArr(int *p,int n) { for(int i=0;i