poj 1715 Hexadecimal Numbers 排列组合
生活随笔
收集整理的這篇文章主要介紹了
poj 1715 Hexadecimal Numbers 排列组合
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 /**
2 大意: 給定16進制數的16個字母,,求第k大的數,,要求數的長度最大為8.,并且每個數互不相同。
3 思路: 從高到低挨個枚舉,每一位能組成的排列數 ,拿最高位來說,能做成的排列數為15*A(15,len-i)
4 第二位 A(14,len-2)。。這樣就可以找到k大的數的長度
5 接下來 。找第k大的數。同上理 ,挨個枚舉每一位即可。。若加上該位的排列數大于k,則該位就是這個數,繼續枚舉下一位
6 **/
7
8 /** 大神思路
9 首先確定數字串的長度Len:從大到小枚舉Len,每個Len下有15*P(15, Len-1)個數字串。每次用這個個數扣除輸入的序數Count,直到序數Count將扣為負數時停止,就確定了長度Len。
10
11 然后從高位到低位,從大到小確定每位數字:設當前確定的數字為第i位,則第i位的任何一個取值,都有P(16 - (Len - i + 1), i - 1)個數字串將已確定的第1到i位作為前綴。每次用這個個數扣除輸入的序數Count,直到序數Count將扣為負數時停止,就確定了當前位的數字。
12
13 注意不能有前導0。
14 **/
15 #include <iostream>
16
17 using namespace std;
18 char num[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
19 int ans[10];
20
21 int Axy(int x,int y){
22 int res =1;
23 if(y==0)
24 return 1;
25 while(y--){
26 res *= x;
27 x--;
28 }
29 return res;
30 }
31
32 void solve(int count){
33 bool vis[16]={0},head = false;
34 int uselen = 0,countv;
35 for(int i=1;i<=8;i++){
36 int cnt = 15;
37 while(cnt){
38 if(!vis[cnt]){
39 if((countv = Axy(16-1-uselen,8-i))<count){
40 count -= countv;
41 }else{
42 vis[cnt] = true;
43 break;
44 }
45 }
46 cnt--;
47 }
48 ans[i] = num[cnt];
49 if(head||ans[i]!='0') uselen++;
50 if(ans[i]!='0') head = true;
51 }
52 }
53
54 int main()
55 {
56 int cnt;
57 while(cin>>cnt){
58 bool head = false;
59 solve(cnt);
60 for(int i=1;i<=8;i++){
61 if(head||ans[i]!='0'){ //去除前導0
62 cout<<(char)ans[i];
63 head = true;
64 }
65 }
66 if(!head) // 若全為0 ,則輸出0
67 cout<<0;
68 cout<<endl;
69 }
70 return 0;
71 }
?
轉載于:https://www.cnblogs.com/Bang-cansee/p/3724108.html
總結
以上是生活随笔為你收集整理的poj 1715 Hexadecimal Numbers 排列组合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Indy中判断邮件来源
- 下一篇: Drools规则引擎入门小demo