您的位置:首页 > 其它

康托展开和逆展开

2017-03-30 22:54 246 查看
解析http://www.2cto.com/kf/201311/260148.html

//展开,给你一个排列,让你求这是第几个排列
//逆展开,给你一个数n,让你求第n个排列是什么
#include<iostream>
using namespace std;
int  fac[] = {1,1,2,6,24,120,720,5040,40320}; //i的阶乘为fac[i]
int a[5]={1,2,3,4,5};
void f1()
{
int b[5],i,j,num=0,t;
for (i=0; i<5; i++)
cin>>b[i];   //求b是第几个排列
for (i=0 ;i<5; i++)
{
t = 0;
for (j=i+1; j<5; j++)
{
if(b[i]>b[j])
{
t++; //t为a[i]在数组中为第几大(从0开始)
}
}
num += t*fac[5-i-1];
}
cout<<num+1<<endl; //是num个比b小的排列,而b是第num+1个
}
void f2()
{
int i,j,k,t,v[100]={0},b[5];
cin>>k; //找第k个排列
k--;
for (i=0; i<5; i++)
{
t = k / fac[5-i-1];
for (j=1; j<=5; j++)
{
if (v[j]==0)
{
if (t==0)
break;
t--;
}
}
b[i] = j;
v[j] = 1;
k = k % fac[5-i-1];
}
for (i=0 ;i<5; i++)
cout<<b[i]<<" ";
}
int main()
{
f1();//展开
f2();//逆展开
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: