问题 B: 数制转换
时间限制 : 1.000 sec 内存限制 : 32 MB
题目描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。
输入
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
输出
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F)。
样例输入
4 123 10
样例输出
27
提示
用字符串存储和表示不同进制的数。
#include <iostream>
#include <vector>
#include <cmath>
#include <unordered_map>
using namespace std;
char d[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char f[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
unordered_map<char, int> map;
int main() {
int a, b;
string n;
for (int i = 0; i < 16; ++i) {
map.insert({d[i], i});
map.insert({f[i], i});
}
while (cin >> a >> n >> b) {
int decimal = 0;
for (int i = n.size() - 1; i >= 0; i--) {
decimal = decimal + (map[n[i]]) * pow(a, n.size() - 1 - i);
}
vector<char> v;
do {
v.push_back(d[decimal % b]);
decimal /= b;
} while (decimal);
for (int i = v.size() - 1; i >= 0; i--)
cout << v[i];
cout << endl;
}
return 0;
}