难以置信,就都用10进制作为中介再转换为其他进制数即可
#include <iostream>
#include <map>
#include <cmath>
using namespace std;
int main() {
map<char, int> ctoi = {
{'A',10},{'B',11},{'C',12},{'D',13},{'E',14},{'F',15},{'G',16},
{'H',17},{'I',18},{'J',19},{'K',20},{'L',21},{'M',22},{'N',23},
{'O',24},{'P',25},{'Q',26},{'R',27},{'S',28},{'T',29},
{'U',30},{'V',31},{'W',32},{'X',33},{'Y',34},{'Z',35}
};
map<int, char> itoc = {
{10,'a'},{11,'b'},{12,'c'},{13,'d'},{14,'e'},{15,'f'},{16,'g'},
{17,'h'},{18,'i'},{19,'j'},{20,'k'},{21,'l'},{22,'m'},{23,'n'},
{24,'o'},{25,'p'},{26,'q'},{27,'r'},{28,'s'},{29,'t'},
{30,'u'},{31,'v'},{32,'w'},{33,'x'},{34,'y'},{35,'z'}
};
// 将m进制的数X(怕含有字母用string代替)转换为n进制的数输出
int m, n;
string s;
cin >> m >> n >> s;
long long num = 0;
int cnt = 0;
// 从低位开始还原数
for (int i = s.size() - 1; i >= 0; --i) {
if (s[i] >= 48 && s[i] <= 57) {
num += (s[i] - '0') * pow(m, cnt);
cnt++;
}
else {
num += ctoi[s[i]] * pow(m, cnt);
cnt++;
}
}
// 再转化为n进制的数
cnt = 0;
char ans[100];
while (num) {
int digit = num % n;
if (digit >= 0 && digit <= 9) {
ans[cnt++] = digit + '0';
}
else {
ans[cnt++] = itoc[digit];
}
num /= n;
}
// 逆序输出结果
for (int i = cnt - 1; i >= 0; i--) {
printf("%c", ans[i]);
}
printf("\n");
return 0;
}

京公网安备 11010502036488号