#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进制的第二个最低位,依次类推,可以得到答案。推导过程不待写了。

京公网安备 11010502036488号