数字全排列

Description
从1~9之间顺序取N个数字,组成每位数不重复的所有可能的N位数,按从小到大的顺序进行编号,当输入其中的任何一个数M是,能找出该数对应的编号。如:当N = 3,M = 132时,则输出: [123(1), 132(2), 213(3), 231(4), 312(5), 321(6)]——> X = 2
Input
输入只有一行,两个正整数N和M(1 ≤ N ≤ 9,1 ≤ K ≤ 987654321),之间用一个空格分隔开。
Output
输出对应的编号X。

Sample Input

3 132

Sample Output

2





#include<stdio.h>
long f(long n){return n<=2?n:n*f(n-1);}
int main()
{
long n,k,i,t=0,sum=1,a[9],b[10]={0},r;
scanf("%d %d",&n,&k);
while(k)a[t++]=k%10,k/=10;
t--;
while(t>=0)
{
r=1;
for(i=1;i<=n;i++)
if(b[i]==0)
if(i<a[t])r++;
else if(i==a[t])break;
sum+=(r-1)*f(t),b[a[t]]++;
t--;
}
printf("%d\n",sum);
return 0;
}

posted @ 2013-07-16 11:39  失眠的娃儿  阅读(436)  评论(0编辑  收藏  举报