#include <bits/stdc++.h>
using namespace std;
int char2int(char c){
    if(c >= '0' && c <= '9')
        return c - '0';
    if(c >= 'a' && c <= 'f')
        return c - 'a' + 10;
    return c - 'A' + 10;
}
long get10(string& ori, int a){
    long ans = 0;
    bool flag = true, neg = false;
    for(int i=0; i<ori.length(); i++){
        if(ori[i] == '0' && flag) continue;
        if(ori[i] == '-') {
            neg = true;
            continue;
        }
        flag = false;
        ans *= a;
        ans += char2int(ori[i]);
    }
    if(neg) ans = - ans;
    return ans;
}
char int2char(int a){
    if(a < 10) return '0' + a;
    return 'A' + a - 10;
}
int main() {
    string ori, ans;
    int a, b;
    while(cin >> a){
        cin >> ori >> b;
        long ori_num = get10(ori, a);
        ans = "";
        bool neg = ori_num < 0 ? true : false;
        while(ori_num != 0){
            ans.push_back(int2char(ori_num % b));
            ori_num /= b;
        }
        if(ans == "") ans = "0";
        else if(neg) ans.push_back('-');
        reverse(ans.begin(), ans.end());
        cout << ans << endl;
    }
    return 0;
}
// 64 ????? printf("%lld")

本题是典型的进制转换问题,首先从a进制转换为10进制,从高位到低位进行遍历,每次将前一步得到的数乘a。

之后将得到的10进制数ori_num转换为b进制。ori_num%b就是转换为b进制的最低位,ori_num/b%b就是转换为b进制的第二个最低位,依次类推,可以得到答案。推导过程不待写了。