康托展開及其逆運算

2021-06-26 02:36:18 字數 1007 閱讀 4233

康托展開的wiki介紹

申明:1.用c語言實現。

2.for中的i,j定義適用於c99標準,gcc編譯要新增-std=c99選項。或者將i,j的定義放到for之前的外部作用域。

3.逆運算使用了c99標準的vla,即變長陣列,只能用於區域性作用域,且宣告時不能初始化;也可以不用vla,使用malloc等從堆上分配空間來使用。

4.n為序列長度,即元素個數(從1開始);arr為對應的序列,用字元陣列表示;value為康托展開的值,即序號。

康托展開

int cantor(int n, char arr)

return value;

}

康托展開逆運算

int uncantor(int n, int value, char arr)

return 0;

}

求階乘

int get_factorial(int n)

測試用例(main函式)

#include #include int get_factorial(int n);

int cantor(int n, char arr);

void uncantor(int n, int value, char arr);

int main(void)

, len = 0;

printf("please input the arr(the length between 1~9):");

scanf("%s", arr);

len = strlen(arr);

if(len < 10)

printf("the value is:%d\n", cantor(len, arr));

}else if(c == '1')

return 0;

}

總結 康托展開及其逆運算

這裡先貼一道例題 我們先科普一下康托展開 x an n 1 an 1 n 2 ai i 1 a2 1 a1 0 ai為整數,並且0 ai 簡單點說就是,判斷這個數在其各個數字全排列中從小到大排第幾位。比如 1 3 2,在1 2 3的全排列中排第2位。維基 n位 0 n 1 全排列後,其康托展開唯一且...

康托展開與康托展開的逆運算

康托展開用來求陣列是該全排列的第幾項,康托展開的逆運用用於求全排列的第幾個排列。已知對於1 n個數的全排列,總共的可能是n 種。對於乙個已知的數列比如45321,在第一項是4時,表示第一項在此之前已經填放過1 2 3了,而後面的第二項至第五項則又是乙個全排列,那麼此時的排列數就是3 4 第二位是5,...

康托展開 康托逆展開

x a n n 1 a n 1 n 2 a i i 1 a 1 0 其中a i 為當前未出現的元素中是排在第幾個 從0開始 這就是康托展開。康托展開可用 實現。編輯 把乙個整數x展開成如下形式 x a n n 1 a n 1 n 2 a i i 1 a 2 1 a 1 0 其中a i 為當前未出現的...