题目描述
取1到N共N个连续的数字(1≤N≤9),组成每位数不重复的所有可能的N位数,按从小到大的顺序进行编号。当输入一个编号M时,就能打印出与该编号对应的那个N位数。例如,当N=3时,可组成的所有三位数为:123,132,213,231,312,321
那么,输入编号M=2时,则输出132。
输入
包括两个数,即正整数N(1 <= N <= 9)和正整数M(1 <= M <= 362880)。
输出
只有一行,即与输入的编号M对应的那个N位数。
代码(此为暴力求解,只适合时间复杂度小的答案)
#include<iostream>
#include<string>
using namespace std;
string aarr[370000];
int main()
{
int cishu;
int weishu;
cin >> cishu >> weishu;
int i = 1;
string str = "";
for (int a = 1; a <= cishu&&cishu >= 1; a++)
{
if ((i) == weishu+1) break;
if (cishu == 1) {
str += to_string(a);
aarr[i++] = str;
str = "";
}
for (int b = 1; b <= cishu && cishu >= 2; b++)
{
if ((i) == weishu+1) break;
if (b == a) continue;
if (cishu == 2) {
str += to_string(a)+ to_string(b);
aarr[i++] = str;
str = "";
}
for (int c = 1; c <= cishu && cishu >= 3; c++)
{
if ((i) == weishu+1) break;
if (c == b||c==a) continue;
if (cishu == 3) {
str += to_string(a) + to_string(b) + to_string(c);
aarr[i++] = str;
str = "";
}
for (int d = 1; d <= cishu && cishu >= 4; d++)
{
if ((i) == weishu+1) break;
if (d == b || d == a||d==c) continue;
if (cishu == 4) {
str += to_string(a) + to_string(b) + to_string(c)+ to_string(d);
aarr[i++] = str;
str = "";
}
for (int e = 1; e <= cishu && cishu >= 5; e++)
{
if ((i) == weishu+1) break;
if (e == b || e == a || e == c||e==d) continue;
if (cishu == 5) {
str += to_string(a) + to_string(b) + to_string(c) + to_string(d)+ to_string(e);
aarr[i++] = str;
str = "";
}
for (int f = 1; f <= cishu && cishu >= 6; f++)
{
if ((i) == weishu+1) break;
if (f == b || f == a || f == c || f == d||f==e) continue;
if (cishu == 6) {
str += to_string(a) + to_string(b) + to_string(c) + to_string(d) + to_string(e)+ to_string(f);
aarr[i++] = str;
str = "";
}
for (int g = 1; g <= cishu && cishu >= 7; g++)
{
if ((i) == weishu+1) break;
if (g == b || g == a || g == c || g == d || g == e||g==f) continue;
if (cishu == 7) {
str += to_string(a) + to_string(b) + to_string(c) + to_string(d) + to_string(e) + to_string(f)+ to_string(g);
aarr[i++] = str;
str = "";
}
for (int h = 1; h <= cishu && cishu >= 8; h++)
{
if ((i) == weishu+1) break;
if (h == b || h == a || h == c || h == d || h == e || h == f||h==g) continue;
if (cishu == 8) {
str += to_string(a) + to_string(b) + to_string(c) + to_string(d) + to_string(e) + to_string(f) + to_string(g)+ to_string(h);
aarr[i++] = str;
str = "";
}
for (int ii = 1; ii <= cishu && cishu >= 9; ii++)
{
if ((i) == weishu+1) break;
if (ii == b || ii == a || ii == c || ii == d || ii == e || ii == f || ii == g||ii==h) continue;
if (cishu == 9) {
str += to_string(a) + to_string(b) + to_string(c) + to_string(d) + to_string(e) + to_string(f) + to_string(g) + to_string(h)+ to_string(ii);
aarr[i++] = str;
str = "";
}
}
}
}
}
}
}
}
}
}
cout << aarr[weishu];
return 0;
}