藍橋杯算法提高 排列數


原題:



  算法提高 排列數   時間限制:1.0s   內存限制:256.0MB     問題描述  0、1、2三個數字的全排列有六種,按照字母序排列如下:
  012、021、102、120、201、210
  輸入一個數n
  求0~9十個數的全排列中的第n個(第1個為0123456789)。
輸入格式  一行,包含一個整數n輸出格式  一行,包含一組10個數字的全排列樣例輸入1樣例輸出0123456789數據規模和約定  0 < n <= 10!
思路:

        在這里簡單介紹一下next_permutation函數,這是一個全排列函數,原理是直到當字符串按字典序為倒序為止。所以用在這里正好解決。代碼如下:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
string str = "0123456789";
int n,m = 1;
scanf("%d",&n);
if(n == 1)
printf("0123456789");
else
while (next_permutation(str.begin(), str.end()))
{
if(m == n - 1)
{
cout << str << endl;
break;
}
m++;
}
return 0;
}
需要注意的是:

        因為while里面已經執行next-permutation()函數了,所以是開始就是第二個,所以如果輸入1的話就直接輸出。當然,也可以轉化為do...while()形式:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
string str = "0123456789";
int n,m = 1;
scanf("%d",&n);
do{
if(m++ == n)
{
cout<<str<<endl;
break;
}
}while(next_permutation(str.begin(),str.end()));
return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com