蓝桥杯 十六进制转八进制输出

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
 
 
【思路】 每3位16进制对应4位8进制  所以 每3位16进制将它化为十进制在把这个数按八进制的格式输出
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[1000002];
int d[100];
int get(char x)
{
    if(x>='0'&&x<='9')
        return x-'0';
    else if(x>='a'&&x<='f')
        return x-'a'+10;
    else if(x>='A'&&x<='F')
        return x-'A'+10;
}
int main()
{
    int t;
    scanf("%d",&t);

    while(t--)
    {
        scanf("%s",s);  getchar();
        int len;
        len=strlen(s);
        int p;
        p=len%3;
        int sum=0;
        int f=1;
        for(int i=p-1; i>=0; i--)
        {
            sum+=get(s[i])*f;
            f*=16;
        }
        int flag=0;
        if(sum)
        {
            printf("%o",sum);
            flag=1;
        }
        for(int i=p; i<len; i+=3)
        {
            sum=0;
            f=1;
            for(int k=2; k>=0; k--)
            {
                sum+=get(s[i+k])*f;
                f*=16;
            }
            if(sum)
            {
                printf("%04o",sum);                //!!!这里注意了
                flag=1;
            }
            else if(flag)
                printf("0000");

        }
        printf("\n");
    }
    return 0;
}

 

 
posted @ 2014-03-20 12:46  galaxy77  阅读(402)  评论(0编辑  收藏  举报