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

  • 问题描述

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

  • 输入格式

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

  • 输出格式

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

  • 样例输入

       2
  39
  123ABC

  • 样例输出

        71
  4435274

  • 解题思路

       可将16进制数先转为2进制数,再利用2进制数转为8进制

  • 代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
char z[400000];
int main()
{
    string a;
    int j,i=0,k;
    int n;
    cin>>n;
    while(n--)
    {
        cin>>a;
        i=a.length();
        //cout<<i<<endl;
        k=0;
        for(j=0;j<i;j++)
        {
            switch(a[j])
            {
            case '0':z[k]='0';z[k+1]='0';z[k+2]='0';z[k+3]='0';k+=4;break;

            case '1':z[k]='0';z[k+1]='0';z[k+2]='0';z[k+3]='1';k+=4;break;
            case '2':z[k]='0';z[k+1]='0';z[k+2]='1';z[k+3]='0';k+=4;break;
            case '3':z[k]='0';z[k+1]='0';z[k+2]='1';z[k+3]='1';k+=4;break;
            case '4':z[k]='0';z[k+1]='1';z[k+2]='0';z[k+3]='0';k+=4;break;
            case '5':z[k]='0';z[k+1]='1';z[k+2]='0';z[k+3]='1';k+=4;break;
            case '6':z[k]='0';z[k+1]='1';z[k+2]='1';z[k+3]='0';k+=4;break;
            case '7':z[k]='0';z[k+1]='1';z[k+2]='1';z[k+3]='1';k+=4;break;
            case '8':z[k]='1';z[k+1]='0';z[k+2]='0';z[k+3]='0';k+=4;break;
            case '9':z[k]='1';z[k+1]='0';z[k+2]='0';z[k+3]='1';k+=4;break;
            case 'A':z[k]='1';z[k+1]='0';z[k+2]='1';z[k+3]='0';k+=4;break;
            case 'B':z[k]='1';z[k+1]='0';z[k+2]='1';z[k+3]='1';k+=4;break;
            case 'C':z[k]='1';z[k+1]='1';z[k+2]='0';z[k+3]='0';k+=4;break;
            case 'D':z[k]='1';z[k+1]='1';z[k+2]='0';z[k+3]='1';k+=4;break;
            case 'E':z[k]='1';z[k+1]='1';z[k+2]='1';z[k+3]='0';k+=4;break;
            case 'F':z[k]='1';z[k+1]='1';z[k+2]='1';z[k+3]='1';k+=4;break;
            }
        }
        /*for(i=0;i<k;i++)
        cout<<z[i];
        cout<<endl;*/
        if(k%3==0)
            {
                for(i=0;i<k;)
                {
                    if(z[i]=='0'&&z[i+1]=='0'&&z[i+2]=='0'&&i!=0)
                        {cout<<'0';i+=3;}
                    else if(z[i]=='0'&&z[i+1]=='0'&&z[i+2]=='0'&&i==0)
                        {i+=3;}
                    else if(z[i]=='0'&&z[i+1]=='0'&&z[i+2]=='1')
                        {cout<<'1';i+=3;}
                    else if(z[i]=='0'&&z[i+1]=='1'&&z[i+2]=='0')
                        {cout<<'2';i+=3;}
                    else if(z[i]=='0'&&z[i+1]=='1'&&z[i+2]=='1')
                        {cout<<'3';i+=3;}
                    else if(z[i]=='1'&&z[i+1]=='0'&&z[i+2]=='0')
                        {cout<<'4';i+=3;}
                    else if(z[i]=='1'&&z[i+1]=='0'&&z[i+2]=='1')
                        {cout<<'5';i+=3;}
                    else if(z[i]=='1'&&z[i+1]=='1'&&z[i+2]=='0')
                        {cout<<'6';i+=3;}
                    else if(z[i]=='1'&&z[i+1]=='1'&&z[i+2]=='1')
                        {cout<<'7';i+=3;}
                }
                cout<<endl;
            }
        if(k%3==1)
        {
            if(z[0]=='1')
                cout<<'1';
            for(i=1;i<k;)
            {
                if(z[i]=='0'&&z[i+1]=='0'&&z[i+2]=='0')
                    {cout<<'0';i+=3;}
                else if(z[i]=='0'&&z[i+1]=='0'&&z[i+2]=='1')
                    {cout<<'1';i+=3;}
                else if(z[i]=='0'&&z[i+1]=='1'&&z[i+2]=='0')
                    {cout<<'2';i+=3;}
                else if(z[i]=='0'&&z[i+1]=='1'&&z[i+2]=='1')
                    {cout<<'3';i+=3;}
                else if(z[i]=='1'&&z[i+1]=='0'&&z[i+2]=='0')
                    {cout<<'4';i+=3;}
                else if(z[i]=='1'&&z[i+1]=='0'&&z[i+2]=='1')
                    {cout<<'5';i+=3;}
                else if(z[i]=='1'&&z[i+1]=='1'&&z[i+2]=='0')
                    {cout<<'6';i+=3;}
                else if(z[i]=='1'&&z[i+1]=='1'&&z[i+2]=='1')
                    {cout<<'7';i+=3;}
            }
            cout<<endl;
        }
        if(k%3==2)
        {
            if(z[0]=='0'&&z[1]=='1')
                cout<<'1';
            else if(z[0]=='1'&&z[1]=='0')
                cout<<'2';
            else if(z[0]=='1'&&z[1]=='1')
                cout<<'3';

             for(i=2;i<k;)
                {
                    if(z[i]=='0'&&z[i+1]=='0'&&z[i+2]=='0')
                        {cout<<'0';i+=3;}
                    else if(z[i]=='0'&&z[i+1]=='0'&&z[i+2]=='1')
                        {cout<<'1';i+=3;}
                    else if(z[i]=='0'&&z[i+1]=='1'&&z[i+2]=='0')
                        {cout<<'2';i+=3;}
                    else if(z[i]=='0'&&z[i+1]=='1'&&z[i+2]=='1')
                        {cout<<'3';i+=3;}
                    else if(z[i]=='1'&&z[i+1]=='0'&&z[i+2]=='0')
                        {cout<<'4';i+=3;}
                    else if(z[i]=='1'&&z[i+1]=='0'&&z[i+2]=='1')
                        {cout<<'5';i+=3;}
                    else if(z[i]=='1'&&z[i+1]=='1'&&z[i+2]=='0')
                        {cout<<'6';i+=3;}
                    else if(z[i]=='1'&&z[i+1]=='1'&&z[i+2]=='1')
                        {cout<<'7';i+=3;}
                }
                cout<<endl;
        }

    }
return 0;
}