首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

小弟跪求算法!PS:偶才刚上大二 写个偶看得懂的 多谢了

2012-02-28 
小弟跪求算法!!!!!!PS:偶才刚上大二 写个偶看得懂的 谢谢了Description从1~9之间顺序取N个数字,组成每位数

小弟跪求算法!!!!!!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


热点排行