蓝桥杯十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

#include<iostream>
#include<cmath>
#include<vector>
#include<set>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    string str1;
    string str;
    int k=0;
    int l=0;
    int num=0;
    int v;
    scanf("%d",&n);
    while(n--){
        cin>>str1;
        str="";
        for(int i=0;i<str1.length();i++){
            switch(str1[i]){
                case '0':str+="0000";break;
                case '1':str+="0001";break;
                case '2':str+="0010";break;
                case '3':str+="0011";break;
                case '4':str+="0100";break;
                case '5':str+="0101";break;
                case '6':str+="0110";break;
                case '7':str+="0111";break;
                case '8':str+="1000";break;
                case '9':str+="1001";break;
                case 'A':str+="1010";break;
                case 'B':str+="1011";break;
                case 'C':str+="1100";break;
                case 'D':str+="1101";break;
                case 'E':str+="1110";break;
                case 'F':str+="1111";break; 
            }
        }
        if(str.length()%3==1){
            str = "00"+str;
        }else if(str.length()%3==2){
            str = "0"+str;
        }
        int flag=0;
        int num = 0;
        for(int i=0;i<str.length();i+=3){
            num = (str[i]-'0')*4+(str[i+1]-'0')*2+(str[i+2]-'0');
            if(num){
                flag=1;
            }
            if(flag){
                printf("%d",num);
            }
        }
        printf("\n");
    }
    return 0;
} 

还是写的比较简单的= =,虽然借鉴了别人的思路。。。。。。

posted @ 2018-10-19 14:30  菜の可怜  阅读(186)  评论(0编辑  收藏  举报