十六进制:0~9,A~F;
十进制:0~9;
思路:位权展开法;
例如:十六进制化为十进制的例子:十六进制37 3*·16^1+7*16^0=55,则十进制为55;
现在分两种情况:(1)十六进制为0~9范围内时,设将ASCII值存在数组a[i]里,将ASCII值化为数字:a[i]-'0'...........................................①
再用①*pow(16,len-1-i)得数字;
(2)十六进制为A~F时,设将ASCII值存在数组a[i]里,将ASCII值化为数字:a[i]-'A'+10................................................②
再用②*pow(16,len-i-1)得数字。
题目:问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
思路:其实刚开始做这题时,我受上一题的影响,想用switch来列举,直接的出答案,可惜太天真了!
真正思路:用位权展开法:如十六进制数为:5A4C转换为十进制的方法是,位权展开法:5*16的3次方+A*16的2次方+4*16的1次方+C*16的0次方
其中用到一个函数幂函数pow(16,len-1-i);还用带字符string文件;
代码如下:
#include<iostream>
#include<cmath> //pow函数用到:是幂函数
#include<cstring> //strng函数:字符用到
using namespace std;
int main()
{
string hex; //存原十六进制
long long dec = 0;
cin>>hex;
int len = hex.length();
for(int i=0 ;i<len;i++)
{
if(hex[i] >= 'A')
{
dec += (hex[i] - 'A' + 10)*pow(16,len-1-i); // 将字母转换成数字
}
else
{
dec += (hex[i] - '0')*pow(16,len-1-i); //将字母转换成数字
}
}
cout<<dec;
return 0;
}
注释:hex[i] - 'A' + 10的理解:10 的十六进制是 A A - A + 10 = 10,15 的十六进制是 F F - A + 10 = 15
hex[i] - '0'的理解为:hex[i] 这里面存的是字符型的数字。。。 在ASCII码里‘1’-‘0’ASCII码 就是 1 ,
2’的 ASCII码 50 ‘0’的是 48 相减就是2;
开始提交时正确率一直不能达到100%,检查了代码并没有问题,然后百度了一些别人的一些做法,原来是定义的数据范围不够。8个十六进制数对应的十进制数应该用long long类型变量来表示。
以上是借鉴别人的,在加上自己的一些见解,希望对自己与他人有帮助!