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