蓝桥杯练习题之十六进制转八进制

  基础练习 十六进制转八进制  

时间限制:1.0s   内存限制:512.0MB

      

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
string HtoB(string str1,string str2) //十六进制转二进制
{

    for(int i=0;i<str1.length();i++)
    {
        switch(str1[i])
        {
            case '0':str2+="0000";break;
            case '1':str2+="0001";break;
            case '2':str2+="0010";break;
            case '3':str2+="0011";break;
            case '4':str2+="0100";break;
            case '5':str2+="0101";break;
            case '6':str2+="0110";break;
            case '7':str2+="0111";break;
            case '8':str2+="1000";break;
            case '9':str2+="1001";break;
            case 'A':str2+="1010";break;
            case 'B':str2+="1011";break;
            case 'C':str2+="1100";break;
            case 'D':str2+="1101";break;
            case 'E':str2+="1110";break;
            case 'F':str2+="1111";break;
        }

    }
     return str2;
}
void BtoD(string str1) //二进制转八进制
{
    int i=0;
    if(str1.length()%3==1) str1="00"+str1;
    else if(str1.length()%3==2)
            str1="0"+str1;
        for(;i<str1.length();i+=3)
        {
            int t=(str1[i]-'0')*4+(str1[i+1]-'0')*2+(str1[i+2]-'0')*1;
            if(i==0&&t==0) continue;
            cout<<t;  //输出每一位
    }cout<<endl;
}
int main(){
   string  str1;
   string str2;
   int n,i,j;
   cin>>n;
   for(i=0;i<n;i++)
    {
        str1="";str2="";
        cin>>str1;
   str2=HtoB(str1,str2);
   BtoD(str2);
    }
    return 0;
}
 

发布了24 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xindada559/article/details/84899784