标签:算法
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