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禁止存储的,有利于位操作