cantor 康托

cantor 康托
 1
 2 void  cantor( int  N, int  K)
 3 // N! Kth
 4    // cantor extend
 5    int x=K,cant[100],n=2;
 6    memset(cant,0,sizeof(cant));
 7    for( ; x ; n++){
 8        printf("%d*%d! ",x%n,n-1);
 9        cant[n]=x%n;
10        x/=n;
11    }

12    // convert to permutation
13    int p[100];memset(p,0,sizeof(p));
14    for(int i=n-1;i>=1;i--){
15        // cant []
16        int cnt=0;
17        for(int  j=2;j<=n;j++){
18            // p[]
19            if(cnt==cant[i] && !p[j]){
20                p[j]=i;
21                break;
22            }

23            if( p[j]<i)cnt++;
24        }

25    }

26    //out 
27    for(int i=n;i>=2;i--){
28        printf("%d ",p[i]);
29    }

30    while(n<=N){printf("%d ",n++);}
31    printf("\n");
32}

33

你可能感兴趣的:(cantor 康托)