记录学习,欢迎指正!
/*输入元素个数,在输入一个排列,
输出该排列的字典序,在输出下一个排列
示例:
input:
8
2 6 4 5 8 1 7 3
output:
8227
2 6 4 5 8 3 7 1*/
#include<iostream>
using namespace std;
int main()
{
int A[50];//全排列;
for (int i = 0; i < 50; i++)
{
if (i == 0)A[i] = 1;
else
A[i] = A[i - 1] * i;
}
int n, num[1000],v[1000];
while (cin >> n && n > 0)//输入元素个数;
{
int sum = 0;
//输入排列;
for (int i = 0; i < n; i++)
{
cin >> num[i];
v[i] = 0;
}
//v[j]用来计算数组num中第j个成员在后续成员中比其小的成员个数
for (int i = n-1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (num[j]>num[i])
v[j]++;
}
}
for (int i = 0; i < n; i++)
{
sum += v[i] *A[n-i-1];
}
//输出字典序;
cout << sum << "\n";
int flag;
for (int i = n - 1; i >= 0; i--)
{
flag = 0;
for (int j = i - 1; j >= 0; j--)
{
if (num[i] > num[j])
{
int tem = num[i];
num[i] = num[j];
num[j] = tem;
flag = 1;
break;
}
}
if (flag == 1)break;
}
//输出下一个排列;
if (flag == 1)
{
for (int i = 0; i < n; i++)
cout << num[i] << " ";
}
else
cout << "已是最大排列!";
cout << "\n";
}
return 0;
}