我做题时发现大的全排列可以推排列数,但是不明白,所以发出来分享一下
题目描述:
给你一个数字n,然后再给个数字x,让你从区间[1,n]的数字中找出x个数字排成一列,请你按字典序从小到大输出他们。(就是找排列数)
样例输入
3 2
样例输出
1 2
1 3
2 1
2 3
3 1
3 2
如果是[1,3]的话全排列输出就是
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
发现没有其实就是全排列的前两项
所以只要取全排列前x项,然后去重就可以找到排列数!
这是我这道题的代码
#include <iostream>
#include <algorithm>
using namespace std;
int n,x,t,last,nt,t1;
int a[25];
int main() {
cin>>n;
cin>>x;
for (int i=1; i<=n; i++)
a[i] = i;//输入函数所用材料;
do {
for (int i=1; i<=x; i++) {
if(i==x)
t+=a[i];
else {
t+=a[i];
t*=10;//转换为一个数方便比较,但同时会颠倒(所以之后要颠倒回来)如1 2 3->321
}
}
if(t!=last) {//去重
nt=t;
while(nt>=10) {
t1+=nt%10;
t1*=10;
nt/=10;
}
if(nt<10)
t1+=nt;
while(t1>=10) {
cout<<t1%10<<" ";
t1/=10;
}
if(t1<10)
cout<<t1;
cout<<endl;
t1=0;
last=t;//颠倒数字,如321->123.
}
t=0;
} while (next_permutation(a+1, a+n+1));//全排列函数
}
我刚学c++有点傻,数字不知道怎么颠倒,只能硬搞,所以怪怪的. 我已经也不知道怎么描述代码,就尽量写了一些注释.希望能好看懂一点