31302715242260726926樣例輸出abcdefghijklhgebkflacdjigfkedhjblciaAC代碼如下:
#include<cstdio>#include<cstring>using namespace std;const int maxn=12+2;char a[]="abcdefghijkl";char b[maxn];int stratum(int n){ int sum=1; for(int i=1;i<=n;i++){ sum*=i; } return sum;}void cantor(int t){ int c[maxn]; memset(c,0,sizeof(c)); for(int i=0;i<12;i++){ int temp=t/stratum(11-i); //比當前位小的個數 for(int j=0;j<=temp;j++) if(c[j])temp++; c[temp]=1; b[i]=a[temp]; t%=stratum(11-i); }}int main(){ int n; scanf("%d",&n); while(n--){ int tmp; scanf("%d",&tmp); cantor(tmp-1); for(int i=0;i<12;i++) PRintf("%c",b[i]); printf("/n"); } return 0;} 如何判斷給定一個位置,輸出該位置上的數列,康拓展開的逆運算,例如: {1,2,3,4,5}的全排列,并且已經從小到大排序完畢,請找出第96個數: 首先用96-1得到95 用95去除4! 得到3余23,即有3個數比該數位上的數字小,則該數位的數字為4; 用23去除3! 得到3余5,即有3個數比該數位上的數字小,理應為4,但4已在前面的高位中出現過,所以該數位的數字為5; 用5去除2!得到2余1,即有2個數比該數位上的數字小,則該數位的數字為3; 用1去除1!得到1余0,即有1個數比該數位上的數字小,則該數位的數字為2; 最后一個數只能是1; 所以這個數是45321
新聞熱點
疑難解答