<span style="font-size:18px;">/*描述
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
输入
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
输出一个整数m,占一行,m表示排列是第几位;
样例输入
3
abcdefghijkl
hgebkflacdji
gfkedhjblcia
样例输出
1
302715242
260726926 */
/* 例如,3 5 7 4 1 2 9 6 8 展开为 98884。因为X=2*8!+3*7!+4*6!+2*5!+0*4!+0*3!+2*2!+0*1!+0*0!=98884.
解释:
排列的第一位是3,比3小的数有两个,1和2,以这样的数开始的排列有8!个,就相当于最高位后面的数进行全排列,因此第一项为2*8!
排列的第二位是5,比5小的数有1、2、3、4,由于3已经出现,因此共有3个比5小的数,这样的排列有7!个,因此第二项为3*7!
以此类推,直至0*0! */
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,count;
int num,a[12];
char b[12];
a[1]=1;
a[2]=2;
for(i=3;i<=11;i++)//按照此题输入12个字母,则只需计算到11的阶乘即可
a[i]=a[i-1]*i;//计算阶乘,让数组a[]中存放,1~12的阶乘
scanf("%d",&n);
while(n--)
{
scanf("%s",b);
num=1; //加上自身
for(i=0;i<12;i++)//表示的是数组b[i]
{
count=0; //count用来计算比b[j]小的且在b[j]之后的数有几个
for(j=i+1;j<12;j++)
if(b[i]>b[j])
count++;
num=num+count*a[11-i];
}
printf("%d\n",num);
}
}
</span>
我排第几个
最新推荐文章于 2024-06-24 21:21:43 发布