小白学算法(18)进制转换

147 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

蓝桥杯基础算法其二进制转换

十六进制转为八进制

提示将十六进制转为x进制,然后再将x进制数转为八进制

这里我们就想起计算机世界里面以二进制为主,所以我们将十六进制转为二进制

但是再想个算法去转换就很麻烦了,所以用一种笨办法,直接算出十六进制数转二进制的结果,然后通过switch来获得

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {	
        //设置一个中间变量,用来存储二进制数
        string tow;
        //十六进制数
        string sixteen;
        //最后转换的八进制数
        string eight;
        cin>>sixteen;
        for(int j=0; j<sixteen.length(); j++)
        {
            switch(sixteen[j])
            {
                case '0':tow+="0000";break;
                case '1':tow+="0001";break;
                case '2':tow+="0010";break;
                case '3':tow+="0011";break;
                case '4':tow+="0100";break;
                case '5':tow+="0101";break;
                case '6':tow+="0110";break;
                case '7':tow+="0111";break;
                case '8':tow+="1000";break;
                case '9':tow+="1001";break;
                //注意大小写问题
                case 'A':
                case 'a':tow+="1010";break;
                case 'B':
                case 'b':tow+="1011";break;
                case 'C':
                case 'c':tow+="1100";break;
                case 'D':
                case 'd':tow+="1101";break;
                case 'E':
                case 'e':tow+="1110";break;
                case 'F':
                case 'f':tow+="1111";break;
            }
        }
        
        //因为二进制转八进制,是三位一体  最高7=111
        //所以先判断整体是否能够平均划分
        //%3=1 表示有一位是单独的,肯定是最前面的,所以在最前面进行补0
        if(tow.length()%3==1)
            tow="00"+tow;
        //同理%3=2 有两个是一组的,前面补一个0即可
        if(tow.length()%3==2)
            tow="0"+tow;
        
        //计算前判断是否有前置三个0,如果没有就将前三位进行计算
        if(!(tow[0]=='0'&&tow[1]=='0'&&tow[2]=='0'))
        {
            char temp;
            //111->1*(2^2)+1*(2^1)+1*(2^0) 进制转换公式
            temp = (tow[0]-'0')*4+(tow[1]-'0')*2+tow[2];
            eight += temp;
        }
        
        //然后以三位一组进行计算
        for(int j=3; j<tow.length(); j+=3)
        {
            eight+=(tow[j]-'0')*4+(tow[j+1]-'0')*2+tow[j+2];
        }
        cout<<eight<<endl;
    }
    return 0;
}

十六进制转为十进制

#include<iostream>
#include<string>
#include<math.h>//下面的pow,需要
using namespace std;
int main()
{
    string a;
    cin >> a;
    char b[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
    //string b = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
    //不能用在Devc++中,当然练习系统也不能通过
    int c[10];
    int k = a.length() - 1;//目的对应好幂的次方
    for (int j = 0; j < a.length(); j++)
    {
        for (int i = 0; i < 16; i++)
        {
            if (a[j] == b[i])
            {
                //得到每一位对应的数
                c[k--] = i;
            }
        }
    }
    long long int sum = 0;//应对sum的值超了int的范围
    for (int i = 0; i < a.length(); i++)
    {
        sum += c[i] * pow(16, i);//这简化转的过程  如上八进制的计算 
    }
    cout << sum << endl;
    return 0;
}