蓝桥基础练习 十六进制转八进制 BASIC-12

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

解:先转换成2进制数,再由2进制转换成8进制。(其实每3位16进制数都可以变成4位8进制数,这样转换也可以)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <cmath>
#include <map>

using namespace std;
typedef long long ll;

#define INF 0x7fffffff
const double inf=1e20;
const int maxn=100000+10;
const int mod=1e9+7;
const double pi=acos(-1);
/*
string transform_(int x,int y,string s){
    string res="";
    int sum=0;
}*/

char a[maxn];
int b[maxn*4];
int c[maxn*2];

//b数组为2进制数

int s16[20][4]={
    {0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},
    {0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},
    {1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},
    {1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1},
};

int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        memset(c,0,sizeof(c));
        scanf("%s",a);
        int len=strlen(a);
        for(int i=0;i<len;i++){
            if('A'<=a[i]&&a[i]<='Z')a[i]=a[i]-'A'+10;
            else a[i]=a[i]-'0';
            for(int j=0;j<4;j++){
                b[i*4+j]=s16[(int)a[i]][j];
            }
        }
        //for(int i=0;i<4*len;i++)printf("%d",b[i]);
        //printf("\n");
        int num=0;
        int i=0;
        if(len*4%3!=0){
            i+=len*4%3;

            for(int j=0;j<i;j++){
                c[0]*=2;
                c[0]+=b[j];

            }
            if(c[0]!=0)num++;
        }
        for(;i<4*len;i+=3){
            for(int j=i;j<i+3;j++){
                c[num]*=2;
                c[num]+=b[j];
            }
            num++;
        }
        if(c[0]!=0)printf("%d",c[0]);
        for(int i=1;i<num;i++){
            printf("%d",c[i]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wz-archer/p/12498718.html