n个元素1,2,…、有n!个小同的排列,将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值,例如,当n=3时,6个不同排列的字典序列如下123,132,213,231,312,321。给定n(每个同学要做的n等于你的学号后2位对5取模求余后加上5,就是自己写自己的n值)以及n个元素{1,2,…,n},的一个排列,计算出这个排列的字典序值,以及按字典序排列的下一个排列,如n输入8,输入26458173,输出:它对应的编号是8227,它的下一个序列是26458317.
#include<stdio.h>
#include<stdlib.h>
void SWAP(int * a, int * b)
{
long long t;
t = *a;
*a = *b;
*b = t;
}
int main()
{
int n,i,k,j,t,order[100];
int lis,f[100],mid,h;
f[0]=1;
for(i=1;i<=13;i++){
f[i]=f[i-1]*i;
}
printf("请输入元素的个数(<=13),以及一个序列\n");
if(scanf("%d",&n)!=EOF)
{
int num;
scanf("%d",&num);
for(i=n-1;i>=0;i--){
order[i]=num%10;
num/=10;
}
if(n==1){
printf("该序列是第0个\n");
printf("该序列无下一个序列\n");
}
else if(n>=2)
{
lis=0;
for(i=0,k=n-1;i<n-1;i++,k--)
{
t=0;
for(j=0;j<i;j++)
if(order[j]<order[i])
t++;
lis+=(order[i]-1-t)*f[k];
}
printf("该序列是第%d个\n",lis);
for(i = n-2; i >= 0; i--)
{
if(order[i] < order[i+1])
{
j = i;
for(k = n-1; k > j; k--)
{
if(order[k] > order[j])
{
mid = j+(n-j)/2;
SWAP(&order[j], &order[k]);
for(j++, h = 1; j <= mid; j++, h++)
SWAP(&order[j], &order[n-h]);
}
}
break;
}
}
printf("该序列的下一个序列是:\n");
for(i=0; i < n-1; i++)
printf("%d",order[i]);
printf("%d\n",order[i]);
}
}
return 0;
}
请输入元素的个数(<=13),以及一个序列
8 26458173
该序列是第8227个
该序列的下一个序列是:
26458317
#include<stdio.h>
#include<stdlib.h>
void SWAP(int * a, int * b)
{
long long t;
t = *a;
*a = *b;
*b = t;
}
int main()
{
int n,i,k,j,t,order[100];
int lis,f[100],mid,h;
f[0]=1;
for(i=1;i<=22;i++)
f[i]=f[i-1]*i;
printf("请输入元素的个数,以及一个序列\n");
if(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d",&order[i]);
if(n==1){
printf("该序列是第0个\n");
printf("该序列无下一个序列\n");
}
else if(n>=2)
{
lis=0;
for(i=0,k=n-1;i<n-1;i++,k--)
{
t=0;
for(j=0;j<i;j++)
if(order[j]<order[i])
t++;
lis+=(order[i]-1-t)*f[k];
}
printf("该序列是第%d个\n",lis);
for(i = n-2; i >= 0; i--)
{
if(order[i] < order[i+1])
{
j = i;
for(k = n-1; k > j; k--)
{
if(order[k] > order[j])
{
mid = j+(n-j)/2;
SWAP(&order[j], &order[k]);
for(j++, h = 1; j <= mid; j++, h++)
SWAP(&order[j], &order[n-h]);
}
}
break;
}
}
printf("该序列的下一个序列是:\n");
for(i=0; i < n-1; i++)
printf("%d ",order[i]);
printf("%d\n",order[i]);
}
}
return 0;
}
请输入元素的个数,以及一个序列
8 2 6 4 5 8 1 7 3
该序列是第8227个
该序列的下一个序列是:
2 6 4 5 8 3 1 7