好的,下面来说下具体解法,分两步。第一,先做出全排列从小到大排列,然后在筛选,如何筛选呢?比较大小!我们在每次打印之前先和上一次的结果比较,如果大于才打印,否则不打印。
看代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
long long number=0;
long long last=0;
int N;
int main()
{ void P(int *,int);
int num[100];
string s;
cin>>s;
int len=s.length();
N=len;
for(int i=0; i<len;i++)
{
num[i+1]=s[i]-'0';
}
sort(num+1,num+len+1);
P(num,1);
return 0;
}
void P(int num[],int i) //i表示旋转前i位
{
if(i>=N)
{
//计算一下 这个数有多大
for(int j=1;j<=N;j++)
{
number*=10;
number+=num[j];
}
//和上一个数比较,只有比上一个数大才打印
if(number>last)
{
for(int j=1;j<=N;j++)
cout<<num[j];
cout<<endl;
last=number;
}
// 初始化为0
number=0;
}
else
{
for(int j=i;j<=N;j++) //旋转 前面 j位,j从i开始,也就是从第一位开始旋转。
{
int temp=num[j];
//旋转
for(int k=j;k>i;k--)
num[k]=num[k-1];
num[i]=temp;
//递归
P(num,i+1);
//还原
for(int k=i;k<j;k++)
num[k]=num[k+1];
num[j]=temp;
}
}
}
C++ 的内置外挂欣赏一下:详细介绍 出门右拐不谢!
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int num[100];
string s;
cin>>s;
int len=s.length();
for(int i=0;i<len;i++)
{
num[i]=s[i]-'0';
}
sort(num,num+len);
do{
for( int i=0;i<len;i++)
{
cout<<num[i];
}
cout<<endl;
}while(next_permutation(num,num+len));
return 0;
}