第十三届蓝桥杯大赛个人赛省赛比赛将于2022年4月9日(星期六)举办,趁现在寒假的时间抓紧时间备战一下。因为博主本人报名是C/C++组,所以更新所有内容都是C/C++相关知识。题目全部都是蓝桥杯官网题库真题。今天是备战刷题的第二天。 |
样例输入:
样例输出:
解题思路:
编写程序之前我们需要先知道十六进制和十进制之间是如何转化的,了解了数学思想才能编写出程序。
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;
}