题目地址:
https://www.acwing.com/problem/content/description/3377/
将 M M M进制的数 X X X转换为 N N N进制的数输出。
输入格式:
第一行包括两个整数:
M
M
M和
N
N
N。
第二行包含一个数 X X X, X X X是 M M M进制的数,现在要求你将 M M M进制的数 X X X转换成 N N N进制的数输出。
输出格式:
共一行,输出
X
X
X的
N
N
N进制表示。
数据范围:
2
≤
N
,
M
≤
36
2≤N,M≤36
2≤N,M≤36,
X
X
X最多包含
100
100
100位。
在输入中,当某一位数字的值大于
10
10
10(十进制下)时,我们用大写字母A∼Z
,分别表示(十进制下的)数值
10
∼
35
10∼35
10∼35。
在输出中,当某一位数字的值大于
10
10
10(十进制下)时,我们用小写字母a∼z
,分别表示(十进制下的)数值
10
∼
35
10∼35
10∼35。
先把 X X X的每一位变成十进制然后存进一个int数组里,即求出 X = ∑ a i M i X=\sum a_iM^i X=∑aiMi中的各个 a i a_i ai,然后对 N N N不停的取余,取余的结果的逆序即为其 N N N进制表示,再输出出来即可。代码如下:
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int n, m;
unordered_map<int, char> to_let;
unordered_map<char, int> to_dig;
vector<int> in, out;
int main() {
for (char ch = 'A'; ch <= 'Z'; ch++) {
to_let[ch - 'A' + 10] = ch - 'A' + 'a';
to_dig[ch] = ch - 'A' + 10;
}
cin >> m >> n;
string s;
cin >> s;
for (int i = 0; i < s.size(); i++) {
int x;
if ('A' <= s[i] && s[i] <= 'Z')
x = to_dig[s[i]];
else
x = s[i] - '0';
in.push_back(x);
}
auto get_mod = [&](vector<int>& a, int n) {
int mod;
for (int i = 0; i < a.size(); i++) {
mod = a[i] % n;
a[i] /= n;
if (i + 1 < a.size()) a[i + 1] += mod * m;
}
int i = 0;
// 去掉开头的0,如果a本身是0,则a变为空
while (i < a.size() && !a[i]) i++;
a.erase(a.begin(), a.begin() + i);
return mod;
};
while (in.size()) out.push_back(get_mod(in, n));
for (int i = out.size() - 1; i >= 0; i--)
if (0 <= out[i] && out[i] <= 9)
printf("%d", out[i]);
else
putchar(to_let[out[i]]);
}
时空复杂度 O ( l X ) O(l_X) O(lX), l X l_X lX是 X X X的长度。