信息奥赛题解|A + B Again
🚀 题目浏览
【题目描述】
Give you two hexadecimal numbers, your task is to calculate the sum of them, and print it in hexadecimal too.
Easy ? AC it !
【输入】
Multiple test cases, please process to the End Of File.
Each test case occupies one line, contains two hexadecimal numbers $A$ and $B$, separated by a blank.
It is guaranteed that the length of $A$ and $B$ is less than $15$.
【输出】
For each test case, print the sum of $A$ and $B$ in hexadecimal in one line.
【输入样例】
+A -A
+1A 12
1A -9
-1A -12
1A -AA
【输出样例】
0
2C
11
-2C
-90
【原题链接】
https://acm.hdu.edu.cn/showproblem.php?pid=2057
☘️ 题解分析
进制转换模拟题,考察 十进制 和 十六进制 的相互转换。
一开始手动模拟该过程,复盘时发现可以使用 C/C++ 自带的功能方便的实现进制转换过程。
PS:注意数据范围,判断是否需要开
long long
🧑🏻💻 C++ 代码
手动模拟版 ✅
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
// 十六进制下标(如 'A' -> 10,'F' -> 15,'8' -> 8)
int findi(char a) {
if (a <= '9' && a >= '0') return a - '0';
else return a - 'A' + 10;
}
// 十六进制字符(如 10 -> 'A',15 -> 'F',8 -> '8')
char finds(int x) {
if (x < 10) return (char) ('0' + x);
else return (char) ('A' + x - 10);
}
// 十六进制 -> 十进制
LL get_d(string a) {
// 判断正负号
int flag = 1;
if (a[0] == '-') flag = -1;
// 设定累乘法开始位置
int i = 0;
if (a[0] == '+' || a[0] == '-') i = 1;
// 累乘法进制转换
LL res = 0;
for (; i < a.size(); i++) res = res * 16 + findi(a[i]);
return (LL) flag * res;
}
// 十进制 -> 十六进制
string get_h(LL x) {
if (x == 0) return "0";
// x为负,需要在最后添加'-'
string s = "";
bool flag = true;
if (x < 0) {
flag = false;
x = -x;
}
// 除16取余,逆序排列
while (x){
s = finds(x % 16) + s;
x /= 16;
}
// 添加负号,返回结果
if (flag == false) s = "-" + s;
return s;
}
int main() {
string a, b;
while (cin >> a >> b) {
// 获取a、b的十进制数字
LL da = get_d(a);
LL db = get_d(b);
// 获取十进制结果
string s = get_h(da + db);
cout << s << endl;
}
return 0;
}
优化版 ✅
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
LL a, b;
while (cin >> hex >> a >> b) { // 读取十六进制数据
LL sum = a + b;
if (sum < 0) { // 负数需要提前处理
cout << "-";
sum = -sum;
}
// 输出十六进制数据
cout << hex << uppercase << sum << endl;
}
return 0;
}