康托展开---第几是谁
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);
}
相关文章推荐
- NYIST 143 第几是谁?(逆康托展开)
- nyoj139我排第几个&nyoj第几是谁?——康托展开及康托逆展开
- NYOJ143 第几是谁? 【逆康托展开】
- 康托展开式---我排第几+逆康托展开
- 康托展开(求该排列是第几大的) 模板
- nyist 139 我排第几个&&143 第几是谁(康托展开和逆康托展开)
- 康托展开及其逆运算--我是第几个,第几是谁
- 中国大学毕业生薪水排行揭晓:看看你学校排第几?
- ‘求数组的第几大数’修改后的程序
- 康托展开
- 康托展开(用于全排列与整数的转换)
- 康托展开及逆运算
- 高效的获取当前元素是父元素的第几个子元素
- 康托展开
- 有一幢100楼的大厦,两部手机,让你设计一种算法确切地知道这部手机在第几楼摔下会坏
- 一个未知位数怎么取个,十,百等位,和他是第几位数
- 获取精灵在第几象限(以某个精灵为准)
- POJ 1077 && HDU 1043 Eight A*算法,bfs,康托展开,hash 难度:3
- 我排第几个(康托展开)
- 康托展开