c++ 给定n个十六进制正整数,输出它们对应的八进制数。

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

思路:
1.先将十六进制数转换成二进制数,每一位十六进制转换成四位二进制。
2.再由二进制数转换成八进制,每三位二进制转换为一位八进制

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <sstream>
using namespace std;


int main()
{
    int n;//输入n个十六进制
    int str_length;
    cin>>n;

    string in_str[n];//输入十六进制字符串
    string out_str[n];//输出八进制字符串

    string str;

    string binarystr;//中间代换,存二进制
    string octstr;//中间代换,存八进制

    for(int i=0; i<n; i++)接收十六进制字符串
    {
        cin>>in_str[i];
    }

    for(int i=0; i<n; i++)//
    {
        binarystr="";
        str = in_str[i];

        str_length = str.length();
        for(int j=0; j<str_length; j++)//十六进制转换为二进制
        {
            switch(str[j])
            {
            case '0':
                binarystr+="0000";
                break;
            case '1':
                binarystr+="0001";
                break;
            case '2':
                binarystr+="0010";
                break;
            case '3':
                binarystr+="0011";
                break;
            case '4':
                binarystr+="0100";
                break;
            case '5':
                binarystr+="0101";
                break;
            case '6':
                binarystr+="0110";
                break;
            case '7':
                binarystr+="0111";
                break;
            case '8':
                binarystr+="1000";
                break;
            case '9':
                binarystr+="1001";
                break;
            case 'A':
                binarystr+="1010";
                break;
            case 'B':
                binarystr+="1011";
                break;
            case 'C':
                binarystr+="1100";
                break;
            case 'D':
                binarystr+="1101";
                break;
            case 'E':
                binarystr+="1110";
                break;
            case 'F':
                binarystr+="1111";
                break;
            default:
                break;
            }

        }

        str_length =binarystr.length();
        if(str_length%3==1) //补零,三个二进制转换为一个八进制
            binarystr = "00" + binarystr;
        if(str_length%3==2)
            binarystr = "0" + binarystr;

        str_length =binarystr.length();
        octstr ="";
        int t;
        for(int j=0; j<str_length; j+=3)//二进制转换为八进制
        {
           t = (binarystr[j]-'0')*4 + (binarystr[j+1]-'0')*2 + (binarystr[j+2]-'0')*1;
            
           //int类型转换成string类型
           /*
           //方法一
           switch(t)
           {
               case 0:octstr += '0';break;
               case 1:octstr += '1';break;
               case 2:octstr += '2';break;
               case 3:octstr += '3';break;
               case 4:octstr += '4';break;
               case 5:octstr += '5';break;
               case 6:octstr += '6';break;
               case 7:octstr += '7';break;
               default:break;
           }*/
           //方法二
           stringstream ss;
           ss << t;        //int类型转换成string类型
           octstr += ss.str();
           
        }
        for(int j=0; j<3; j++)
            if(octstr[0]=='0') octstr=octstr.erase(0,1); //删除为0的首字符

        out_str[i] = octstr;//传给输出变量

    }

    for(int i=0; i<n; i++)
        cout<<out_str[i]<<endl;

    return 0;
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值