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

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274
AC代码:
#include <iostream>
#include<stdio.h>
#include <algorithm>
#include<string.h>
#define ll long long
using namespace std;
int main()
{
    char c;
    int t,x,r;
    char a[100005];
    int b[400005];

    scanf("%d",&t);
    while(t--)
    {
        string s="";            ///每次字符串更新
        scanf("%s",a);
        int len=strlen(a);      ///16进制的长度
        for(int i=0;i<len;i++)  ///变成二进制
        {

            if(a[i]>='0' && a[i]<='9')///获取当前位的十六进制值
                x=a[i]-'0';
            else
                x=a[i]-'A'+10;

            for(int j=3;j>=0;j--)
            {
                r=x%2;
                x=x>>1;
                b[i*4+j]=r;
            }
        }
        len = len*4;
        r=len%3;
        for(int i=len-1;i>1;i=i-3)    ///二进制,三位二进制变一位八进制
        {
            x=b[i]+b[i-1]*2+b[i-2]*4;
            c=x+'0';
            s=(c)+s;
        }
        if(r==2)                       ///左边位数不够则不累加
        {
            x=b[1]+b[0]*2;
            c=x+'0';
            s=c+s;
        }
        else if(r==1)
        {
            x=b[0];
            c=x+'0';
            s=c+s;
        }
        if(s[0]=='0')       ///首位是0则
            s=s.substr(1);  ///截取当前下标到末尾
        cout<<s<<"\n";

    }
    return 0;
}

 

posted @ 2018-12-27 22:12  守林鸟  阅读(226)  评论(0编辑  收藏  举报