问题描述
从键盘输入一个不超过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);
}