给定一个整数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。
输入:m, n
输出:第m个数
#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 = , sum = ;
while (n >= base * (k+) -)
{
sum += base;
base *= ;
}
if (n >= base * k)
sum += n - base * k + ;
return sum;
} int ans = ;
void getMth(int n, int m, int& k, int cur)
{
if (++k == m)
{
ans = cur;
return;
}
for (int i = ; i <= ; i++)
{
int t = cur * + i;
if (t <= n)
getMth(n, m, k, t);
if (k >= m)
return;
}
} int main()
{
int m, n, k = ;
cin >> m >> n;
for (int i = ; i <= ; i++)
{
int num = getNum(n, i);
if (num < m)
m -= num;
else
break;
}
getMth(n, m, k, );
cout << ans << endl;
return ;
}
先找到第m个数是1~9哪个数字开头。
然后找这个数字开头的所有数中不超过n的第m个数。