超长的十六进制数转换为八进制

版权声明:个人做题总结专用~ https://blog.csdn.net/tb_youth/article/details/84338849

之前在oj上做过,今天做蓝桥杯基础练习又遇到了这题
but没有一遍AC
基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
提交此题 锦囊1 锦囊2
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。
  AC代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
char a[100002];
int b[400005],c[200002];
int k;
void add_0(int len)
{
    int z = 4*len%3;//没位16进制可以用4位二进制表示
    k = 3 - z;
    /*
    k为化为二进制后应该补的零个数,
    因为之前初始化已经全是0,
    所以之后的二进制数只要从k开始存就行。
    */
}
//十六进制字符化为10进制数字
int num_16(char a)
{
    if(a >= 'A')
        return a - 'A' + 10;
    else
        return a - '0';
}
//每个10进制化为2进制
void num_2(int len)
{
    for(int i = 0; i < len; i++)
    {
        int f = 3,y = num_16(a[i]),t;
        //核心部分,可以自己演示一遍
        while(f >= 0)
        {
            t = y/pow(2,f);
            if(t)
            {
                b[k++] = 1;
            }
            else
            {
                b[k++] = 0;
            }
            y %= (int)pow(2,f);
            f--;
        }
    }
}
//打印8进制数
void print_8()
{
    int j = 0,m = 0;
    //每三位一个8进制数
    for(int i = 2; i < k; i+=3)
    {
        c[j++] = b[i] + b[i-1]*2 + b[i-2]*4;
    }
    //去掉前置0
    while(c[m]==0)
    {
        m++;
    }
    for(int i = m; i < j; i++)
        printf("%d",c[i]);
    printf("\n");
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        memset(a,'\0',sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        scanf("%s",a);
        int len = strlen(a);
        k = 0;//这个要注意,不要放外面去了
        add_0(len);
        num_2(len);
        print_8();
    }
    return 0;
}

  

猜你喜欢

转载自blog.csdn.net/tb_youth/article/details/84338849