小弟跪求算法!!!!!!PS:偶才刚上大二 写个偶看得懂的 谢谢了
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
Source
可以先给个数字全排列的算法 谢谢了
[解决办法]
#include <stdio.h>
#include <string.h>
int main()
{
long a=0,n;
long nt,n1,n2,nLen;
char cIn[10],ct;
long nNum[100]={0};
char Num[10];
scanf( "%d ",&n);
{
for(int i=0;i <n;i++)
cIn[i]=char(i+1+ '0 ');
cIn[n]= '\0 ';
scanf( "%s ",Num);
char *pc=cIn,*pc2;
for(;*pc;pc++)
for(pc2=pc+1;*pc2;pc2++)
if(*pc> *pc2)
ct=*pc,*pc=*pc2,*pc2=ct;
nLen=pc-cIn;
while(nNum[nLen]==0)
{
char cT[100],cOut[100]={0},*pcOut=cOut;
for(n1=0;n1 <=nLen;n1++)cT[n1]=cIn[n1];
for(n1=0;n1 <nLen;n1++)
{
n2=nNum[nLen-n1-1];
if(n2> 0 && cT[n2]==cT[n2-1])break;
*pcOut++=cT[n2];
for(nt=n2;nt <nLen;nt++)cT[nt]=cT[nt+1];
}
if(n1==nLen)
{
if(strcmp(cOut,Num)!=0)
{
a++;
}
else
break;
}
long *pn=nNum+1;
for((*pn)++,n1=1;n1 <nLen;n1++)
if(*pn> n1)*pn++=0,(*pn)++;else break;
}
}
printf( "%d\n ",a+1); //????
return 0;
}
LZ可以揭帖了
Memory:164K Time:124MS
Language:G++ Result:Accepted