版权声明:个人做题总结专用~ 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;
}