您的位置:首页 > 其它

有1,2,3,...,n,n<=9,这n个数全排列,从小到大排好,计算第k个数是什么

2011-11-08 14:59 295 查看
从高位到低位依次选择

int findKthNumber(int n,long k){
if(n<1||n>9||k<1) return -1;
if(n==1){
if(k==1){
cout<<"1"<<endl;
return 0;
}else{
return -1;
}
}
long *counts = new long
;
bool *select = new bool
;
memset(select,0,n*sizeof(bool));

counts[0] = 1;
for(int i=1;i<n;++i){
counts[i]=counts[i-1]*(i+1);//每个阶乘的个数
}
if(k>counts[n-1]){//超出最大范围
delete[] counts;
delete[] select;
return -1;
}
long cur = 0;
int notSelectCount = 0;
int j=0;
for(int i=0;i<n-1;i++){//依次从高位开始输出
cur = (k-1)/counts[n-2-i];
notSelectCount = 0;
for(j =0;j<n;j++){
if(!select[j]){//数字在前面没有输出
++notSelectCount;
if(notSelectCount==cur+1){
break;
}
}
}
select[j] = true;
cout<<j+1;
k -= cur*counts[n-2-i];
}

for(j=0;j<n;j++){//最后一个数字
if(!select[j]){
cout<<j+1<<endl;
break;
}
}

delete[] counts;
counts = NULL;
delete[] select;
select = NULL;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delete
相关文章推荐