46 lines
1.3 KiB
C++
46 lines
1.3 KiB
C++
#include <bits/stdc++.h>
|
||
|
||
using namespace std;
|
||
const int INF = 0x3f3f3f3f;
|
||
int n, r;
|
||
|
||
|
||
//0-15之间的数字转为16进制的数字
|
||
char int_to_char(int a) {
|
||
return a <= 9 ? '0' + a : a - 10 + 'A';
|
||
}
|
||
|
||
//单个字母转换成数字
|
||
int char_to_int(char a) {
|
||
//用句人话描述就是:
|
||
//(1)如果是0到9之间的,就返回a-'0'
|
||
//(2)如果是A-F之间的,就返回10+a-'A'
|
||
return '0' <= a && a <= '9' ? a - '0' : 10 + a - 'A';
|
||
}
|
||
|
||
//深度优先搜索
|
||
void dfs(int x, string path, int sum) {
|
||
if (sum == n) {
|
||
cout << path << endl;
|
||
return;
|
||
}
|
||
for (int i = 0; i < -r; i++)
|
||
dfs(x - 1, path + int_to_char(i), sum + i * pow(r, x - 1));
|
||
}
|
||
|
||
int main() {
|
||
cin >> n >> r;
|
||
//求i位-r进制的每一位位数上的极大值和极小值
|
||
int x, Max = -INF, Min = INF;
|
||
int sum = 0;
|
||
for (x = 1;; x++) {
|
||
//因为r为负数,那么-r代表对应的正数,比如-16进制,那么-r代表16,16-1代表15,也就是说,这个数位的最大上限是15,就是F
|
||
sum += (-r - 1) * pow(r, x - 1);
|
||
if (sum < Min) Min = sum;
|
||
if (sum > Max) Max = sum;
|
||
if (n >= Min && n <= Max) break;
|
||
}
|
||
//深搜
|
||
dfs(x, "", 0);
|
||
return 0;
|
||
} |