您的位置:首页 > 其它

康托展开---第几是谁

2013-11-12 20:55 169 查看


第几是谁?

时间限制:3000 ms | 内存限制:65535 KB
难度:3

描述现在有"abcdefghijkl”12个字符,将其按字典序排列,如果给出任意一种排列,我们能说出这个排列在所有的排列中是第几小的。但是现在我们给出它是第几小,需要你求出它所代表的序列.

输入第一行有一个整数n(0<n<=10000);

随后有n行,每行是一个整数m,它代表着序列的第几小;
输出输出一个序列,占一行,代表着第m小的序列。
样例输入
3
1
302715242
260726926


样例输出
abcdefghijkl
hgebkflacdji
gfkedhjblcia


count每次都要初始化为0, 注意两个if的次序。

#include<stdio.h>

char c[13] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};

int record[20];

int factorial(int n);

void cantor(int m)

{

int count = 0, num, k, i, j, r, record[20] = {0};

m = m - 1;

for(i = 11; i > 0; i--)

{

count = 0;

k = factorial(i);

num = m/k;

m = m % k;

for(j = 0; j < 12; j++)

{

if(count == num)

break;

if(!record[j])

count++;

}

for(r = j; r < 12; r++)

{

if(!record[r])

break;

}

printf("%c", c[r]);

record[r] = 1;

}

for(i = 0; i < 12; i++)

{

if(!record[i])

{

printf("%c", c[i]);

break;

}

}

printf("\n");

}

int main(void)

{

int a[10000], i, n;

scanf("%d", &n);

for(i = 0; i < n; i++)

{

scanf("%d", &a[i]);

cantor(a[i]);

}

return 0;

}

int factorial(int n)

{

if(n == 1)

return 1;

else

return n * factorial(n-1);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: