蓝桥杯 试题 基础练习 十六进制转十进制

时间:2021-02-16 00:46:11


问题描述

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

样例输入

FFFF

样例输出

65535

 

思路分析

很简单的一道题,首先十六进制转换成二进制,然后二进制转换成十进制。

十六进制转换成二进制:可以用数组或者map存储转换进制的规则,然后循环遍历把结果存在一个字符串里面。

二进制转换成十进制:逆序字符串,从第一个开始算起。二进制的第i位的基=十进制的2的i次幂

AC代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#include<cmath>
using namespace std;

void sto2(string s){
map<string,string> a;
a["0"]="0000";
a["1"]="0001";
a["2"]="0010";
a["3"]="0011";
a["4"]="0100";
a["5"]="0101";
a["6"]="0110";
a["7"]="0111";
a["8"]="1000";
a["9"]="1001";
a["A"]="1010";
a["B"]="1011";
a["C"]="1100";
a["D"]="1101";
a["E"]="1110";
a["F"]="1111";
string b;
for(int i=0;i<s.length();i++)//十六进制转换成二进制 存在b里面
{
string c;
c+=s[i];
b+=a[c];
}
while(b[0]=='0')//去前面的0
b.erase(0,1);
string ss(b.rbegin(),b.rend());//逆序
long long ans=0;
for(int i=0;i<ss.length();i++)//二进制转换成十进制
ans+=(ss[i]-'0')*pow(2,i);
cout<<ans<<endl;
}
int main(){
string s;
string ss="0";//因为有去0的操作,所有如果只是一个0的话,就直接输出。
cin>>s;
if(s==ss)
cout<<s<<endl;
else
sto2(s);

}