康托展开和逆康拓展开

    xiaoxiao2021-12-13  22

    康托展开: 

    int fac[]={1,1,2,6,24,120,720,5040,40320,362880}; //0~9的阶乘

    int cantuo(int s[],int e) //第一位从0开始,e为最后一个的下标 { int i,j,temp,num=0; for (i=0;i<e;i++) { temp=0; for (j=i+1;j<=e;j++) { if (s[j]<s[i]) { temp++; } } num+=fac[e-i]*temp; } return num+1; } 逆康拓展开

    int* uncantuo(int x,int k) { int *res=new int[10]; bool vis[10]; int t,i,j,l; x--; memset(vis,false,sizeof(vis)); 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(!vis[j]) l++; } j--; vis[j]=true; res[i-1]=j; } return res; }

    转载请注明原文地址: https://ju.6miu.com/read-950243.html

    最新回复(0)