康托展開的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 為當前未出現的...