蓝桥杯C/C++组备战第二天

137 阅读2分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

第十三届蓝桥杯大赛个人赛省赛比赛将于2022年4月9日(星期六)举办,趁现在寒假的时间抓紧时间备战一下。因为博主本人报名是C/C++组,所以更新所有内容都是C/C++相关知识。今天是备战刷题的第一天。
题目:

从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

样例输入

FFFF

样例输出

65535

解题思路: 编写程序之前我们需要先知道十六进制和十进制之间是如何转化的,了解了数学思想才能编写出程序。

1、 首先明白16进制数(从右到左数是第0位,第1位,第2位……)的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方,依次这样排列下去。一定要记清楚是从右到左。

2、 明白ABCDEF表示的二进制数字分别是10,11,12,13,14,15。

3、 十六进制转换成十进制的公式是:要从右到左用二进制的每个数去乘以16的相应次方,然后这些数字相加就是对应的十进制了。

第一天的练习题目是将十六进制转换为八进制,今天是十六进制转换为十进制。十六进制转换为十进制就不需要先转换为二进制了,可以直接转换为十进制。 输入的十六进制还是按照字符串处理,先将每一位转换成十进制,A、B、C、D、E、F、分别对应的就是十进制的10、11、12、13、14、15、16.然后每一位的权值计算出最终的十进制数。

完整代码:

#include <iostream>
#include <cmath>
using namespace std;
int toNum(char str) {
    switch (str) {
        case '0'    :
            return 0;
        case '1'    :
            return 1;
        case '2'    :
            return 2;
        case '3'    :
            return 3;
        case '4'    :
            return 4;
        case '5'    :
            return 5;
        case '6'    :
            return 6;
        case '7'    :
            return 7;
        case '8'    :
            return 8;
        case '9'    :
            return 9;
        case 'A'    :
            return 10;
        case 'B'    :
            return 11;
        case 'C'    :
            return 12;
        case 'D'    :
            return 13;
        case 'E'    :
            return 14;
        case 'F'    :
            return 15;
    }
}
int main() {
    string num;
    cin >> num;
    int ans = 0;
    for (int i = 0; i < int(num.size()); ++i) {
        ans += toNum(num[i]) * pow(16, num.size() - 1 - i);
    }
    cout << ans << endl;
}