难以置信,就都用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;
}