标签:算法
X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,并且0<=ai<i(1<=i<=n)。这就是康托展开。康托展开可用代码实现。
#include<cstdio>
using namespace std;
int fac[] = {1,1,2,6,24,120,720,5040,40320,362880};
void cantor(int a[], int k) {//康托展开
int i,j,tmp,num=0;
for (i=0;i<k;i++) {
tmp=0;
for (j=i+1;j<k;j++)
if(a[j]<a[i])
tmp++;
num+=fac[k-i-1]*tmp;
}
printf("%d\n",num);
}
void uncantor(int x, int k) {//康托逆展开
int res[10];
int i,j,l,t;
bool h[20];
for (i=1;i<=k;i++) {
t=x/fac[k-i];
x-=t*fac[k-i];
for (j=1,l=0;l<=t;j++)
if(!h[j])l++;
j--;
h[j]=true;
res[i-1]=j;
}
for(i=0;i<k;i++)
printf("%d",res[i]);
printf("\n");
}
int main(){
int a[]={1,2,3,4,5};
uncantor(16,5);
cantor(a,5);
return 0;
}标签:算法
原文地址:http://blog.csdn.net/neng18/article/details/24718867