給定一個整數n,給定一個整數m,將1~n個整數按字典順序進行排序,返回排序後第m個元素。n最大可爲5000000。字典排序的含義爲:從最高位開始比較。1開頭的數字排在最前面,而後是2開頭的數字,而後是3開頭的數字……最高位相同的數字,按一樣的邏輯比較次高位……以此類推。
例:給定整數爲n=13,m=5,那麼字典排序結果爲: [1,10,11,12,13,2,3,4,5,6,7,8,9] ,程序最終輸出爲13。ios
輸入:m, nspa
輸出:第m個數code
#include<iostream> #include<string> #include<vector> #include<set> #include<map> #include<limits.h> #include<algorithm> #include<cstring> using namespace std; //返回以數字k開頭,<=n的數的個數 int getNum(int n, int k) { int base = 1, sum = 0; while (n >= base * (k+1) -1) { sum += base; base *= 10; } if (n >= base * k) sum += n - base * k + 1; return sum; } int ans = 0; void getMth(int n, int m, int& k, int cur) { if (++k == m) { ans = cur; return; } for (int i = 0; i <= 9; i++) { int t = cur * 10 + i; if (t <= n) getMth(n, m, k, t); if (k >= m) return; } } int main() { int m, n, k = 0; cin >> m >> n; for (int i = 1; i <= 9; i++) { int num = getNum(n, i); if (num < m) m -= num; else break; } getMth(n, m, k, 1); cout << ans << endl; return 0; }
先找到第m個數是1~9哪一個數字開頭。blog
而後找這個數字開頭的全部數中不超過n的第m個數。排序