AcWing 3452. 进制转换
原题链接
简单
我直接用哈希表重拳出击
C++ 代码
#include<iostream>
#include<cmath>
#include<cctype>
#include<map>
using namespace std;
int toDecimal(const string& data) {
if (data.empty()) {
return 0;
}
int res = 0;
map<char, int> Hashmap;
Hashmap.insert(make_pair('A', 10));
Hashmap.insert(make_pair('B', 11));
Hashmap.insert(make_pair('C', 12));
Hashmap.insert(make_pair('D', 13));
Hashmap.insert(make_pair('E', 14));
Hashmap.insert(make_pair('F', 15));
// 获取符号位 + -
char sign = data[0];
if (sign == '-') {
decltype(data.size()) len = data.size() - 3;
for (decltype(data.size()) i = 3, j = 1; i < data.size(); i++, j++) {
// 判断当前获取到的字符是数字还是字母
if (isalpha(data[i])) {
map<char, int>::iterator it = Hashmap.find(toupper(data[i]));
// 指数函数的幂 (len - j)
res = res - (*it).second * static_cast<int>(pow(16, len - j));
}
else {
res = res - (data[i] - '0') * static_cast<int>(pow(16, len - j));
}
}
}
else {
// 指数的长度
decltype(data.size()) len = data.size() - 2;
for (decltype(data.size()) i = 2, j = 1; i < data.size(); i++, j++) {
if (isalpha(data[i])) {
map<char, int>::iterator it = Hashmap.find(toupper(data[i]));
res = res + (*it).second * static_cast<int>(pow(16, len - j));
}
else {
res = res + (data[i] - '0') * static_cast<int>(pow(16, len - j));
}
}
}
return res;
}
int main() {
string data;
while (cin >> data) {
cout << toDecimal(data) << endl;
}
return 0;
}