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