- 问题描述
某天、小晨在路上背着单词,突遇一外星人,外星人对小晨很感兴趣,为了考验小晨的智商,就向小晨提问简单加法,由于外星人使用16进制,所以,小晨必须用16进制回答。 - 输入说明
首先输入一个整数T,
以下T行,每行两个16进制数字
- 输出说明
T行,每行一个16进制数,为求出的两数之和。
其中的英文字母a到f为小写。
- 输入范例
cpp
2
4b0d 4887
2745 7438
- 输出范例
cpp
9394
9b7d
感想:使用了unordered_map<char,int> 将十六进制转为纯数字。
代码如下:
cpp
#include <bits/stdc++.h>
using namespace std;
struct add {
string a;
string b;
};
int main() {
int n;
cin>>n;
vector<add> arr(n);
for(int i = 0; i<n; ++i) {
cin>>arr[i].a>>arr[i].b;
}
unordered_map<char,int> map = {{'1',1},{'2',2},{'3',3},{'4',4},{'5',5},{'6',6},{'7',7},
{'8',8},{'9',9},{'a',10},{'b',11},{'c',12},{'d',13},{'e',14},{'f',15}
};
for(int i =0; i<n; ++i) {
string temp_a = arr[i].a,temp_b = arr[i].b;
string ans;
int j = temp_a.size();
int k = temp_b.size();
int carry = 0,add;
while(j&&k) {
add = map[temp_a[--j]]+map[temp_b[--k]]+carry;
carry = add/16;
if(add%16>=10) {
char target = add%16-10 +'a';
ans = target+ans;
} else
ans = to_string(add%16)+ans;
}
while(j) {
add = map[temp_a[--j]]+ carry;
carry = add/16;
if(add%16>=10) {
char target = 'a'+ add%16-10;
ans = target+ans;
} else
ans = to_string(add%16)+ans;
}
while(k) {
add = map[temp_b[--k]]+ carry;
carry = add/16;
if(add%16>=10) {
char target = 'a'+ add%16-10;
ans = target+ans;
} else
ans = to_string(add%16)+ans;
}
if(carry) ans = to_string(carry) + ans;
cout<<ans<<endl;
}
return 0;
}