加载中...

信息奥赛题解|A + B Again


信息奥赛题解|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;
}

文章作者: Rickyの水果摊
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rickyの水果摊 !
  目录