1 unsigned long cantor(unsigned long S)
2 {
3 long x=0,i,p,k,j;
4 bool hash[8]={false};
5 for (i=8;i>=2;i--)
6 {
7 k=S>> 3*(i-1);
8 S-=k<<3*(i-1);
9 hash[k]=true;
10 p=k;
11 for (j=0;j<=k-1;j++)
12 if (hash[j])
13 p--;
14 x+=fac[i-1]*p; //fac存的是阶乘 fac[1] = 1, fac[2] = 2, fac[3] = 6
15 }
16 return x;
17 }
其实就是求全排列中,某一个排列的序号
比如321,对应1,2,3的全排列的第6号
上面这个是8禁止存储的,有利于位操作
|