十六进制转八进制(完整代码)

这篇博客介绍了一个C++程序,用于将输入的十六进制正整数转换为八进制数。程序首先判断输入的十六进制数是否为3的整数倍,然后将其转换为二进制,再将二进制数按每3位转换为8进制,最后输出无前导0的八进制数。样例输入包括39和123ABC,对应的八进制输出分别为71和4435274。
摘要由CSDN通过智能技术生成

题目:

给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1 <= n <= 10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
 

代码:

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
#define N 1000
int main() 
{
    void change(string str, int l);
    int i, n;
    cin >> n;       //输入个数n
    string st[N];   //字符串数组
    int len[N];
    
    for (i = 0; i < n; i++) //输入n个十六进制字符串数组
    {
        cin >> st[i];
    }

    for (i = 0; i < n; i++) 
    {
        len[i] = st[i].length();//读取st[i]的实际长度 
    }

    for (i = 0; i < n; i++) 
    {
        change(st[i], len[i]);  //进行进制的转化,每次转化一个十六进制
    }
    return 0;
}
void change(string str, int l) 
{
    string add;
    int i, j, k;
    //下面的条件语句用来判断每个字符串是否为3的整数倍个,不够往前补0.
    //因为八进制和十六进制换成二进制的最小公倍数位12及 3个16进制数 
    
    if (l % 3 == 1) //4  7 10 13 16   求余为1说明差2个0
    {
        add = "00";
        str = add + str;
    }
    else if (l % 3 == 2) //5 8 11 14   求余为2说明差1个0
    {
        add = "0";
        str = add + str;
    }

    l = str.length();//因为补零了,重新计算字符串长度 
    
    string str1 = "", str2 = "", str3 = "";

    for (k = 0; k < l / 3; k++) //将字符串进行划分,每三个字符进行内循环的转化
    {   
        //将字符串分为l/3组,一组一组算 
        str1 = "";
        for (i = k * 3; i < k * 3 + 3; i++) 
        { 
            //每组有三个16进制数,所以循环3次。并且i与k是有关联的 
            switch (str[i]) 
            {
                case '0':str1 += "0000"; break;
                case '1':str1 += "0001"; break;
                case '2':str1 += "0010"; break;
                case '3':str1 += "0011"; break;
                case '4':str1 += "0100"; break;
                case '5':str1 += "0101"; break;
                case '6':str1 += "0110"; break;
                case '7':str1 += "0111"; break;
                case '8':str1 += "1000"; break;
                case '9':str1 += "1001"; break;
                case 'A':str1 += "1010"; break;
                case 'B':str1 += "1011"; break;
                case 'C':str1 += "1100"; break;
                case 'D':str1 += "1101"; break;
                case 'E':str1 += "1110"; break;
                case 'F':str1 += "1111"; break;
                default:break;
            }
        }
        //以下循环转8进制    因为一次操作是对3个字符进行的,三个16进制的字符转成二进制就是12个字符,这12个字符按照每3个转为8进制,所以就有4组了
        for (i = 0; i < 4; i++) 
        {  //因为有12位二进制数,所以会有4个8进制数 
            str2 = "";
            
            for (j = i * 3; j < i * 3 + 3; j++) 
            {
                //每三个二进制提取出来通过判断转为对应8进制数 
                str2 = str2 + str1[j];
            }

            if (str2 == "000")str3 += '0';
            if (str2 == "001")str3 += '1';
            if (str2 == "010")str3 += '2';
            if (str2 == "011")str3 += '3';
            if (str2 == "100")str3 += '4';
            if (str2 == "101")str3 += '5';
            if (str2 == "110")str3 += '6';
            if (str2 == "111")str3 += '7';
        }
    }

    for (i = 0; i < str3.length(); i++)
    {
        if (str3[0] == '0')
        {
            str3 = str3.erase(0, 1); //删除为0的首字符 

        }
        else            //如果字符串第一个字符不是0,就退出
            break;  
    }
    cout << str3 << endl;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值