现在的位置: 首页 > 综合 > 正文

康托展开与逆康托展开

2017年12月16日 ⁄ 综合 ⁄ 共 400字 ⁄ 字号 评论关闭

#include <stdio.h>

int fac[] = {1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800};

int Cantor(int n,char* s)
{
    int ret = 0;
    for(int i=0;i<n;i++)
    {
        int cnt = 0;
        for(int j=i+1;j<n;j++)
            if(s[j] < s[i])
                ++cnt;
        ret += cnt * fac[n-1-i];
    }
    return ret;
}

void rCantor(int n,int nth,char *s)
{
    int a[12];
    for(int i=0;i<n;i++)
        a[i] = i;
    for(int i=0;i<n;i++)
    {
        int k = nth / fac[n-1-i];
        nth = nth % fac[n-1-i];
        s[i] = a[k] + 'a';
        for(int j=k;j<n-1;j++)
            a[j] = a[j+1];
    }
	s[n] = '\0';
}
【上篇】
【下篇】

抱歉!评论已关闭.