蓝桥杯备战-十六进制转为十进制

来源:互联网 发布:淘宝的花呗怎么开通 编辑:程序博客网 时间:2024/05/17 02:11

十六进制: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类型变量来表示。

以上是借鉴别人的,在加上自己的一些见解,希望对自己与他人有帮助!微笑

0 0
原创粉丝点击