#include<stdio.h>
#include<string.h>
#include<ctype.h>
void reverse(char s[]) //字符串反转
{
char t;
int i,len;
len=strlen(s);
for(i=0;i<len/2;i++)
{
t=s[i];
s[i]=s[len-1-i];
s[len-1-i]=t;
}
}
char hex[100010],bin[400010]; //十六进制 和二进制
int main()
{
int temp=0,i=0,j,n,x,ans;
scanf("%d",&x);
while(x--)
{
scanf("%s",hex); //输入一个十六进制的数
j=0;
if(*hex=='0') //因为没有前置零 所以如果十六进制为零,则输出零
{
printf("0\n");
continue;
}
for(i=strlen(hex)-1;i>=0;i--) //将十六进制转化为二进制
{
if(isdigit(hex[i])) //将每一位转化为相应的数字
temp=hex[i]-'0';
else
temp=hex[i]-'7';
ans=1; //每一次ans初始化为 1
while(temp) //将每一位十六进制的数转换为其二进制的逆置形式 如:D 的二进制是1101,但转化bin字符数组的逆置形式就是1011;
{
bin[j++]=temp%2+'0';
temp/=2;
ans=0;
}
while(j%4!=0||ans) //不足四位的用 0 补齐;ans的作用当temp的值为零时,上一个while循环不会被执行,但需要用四个 0 补上
{
bin[j++]='0';
if(j%4==0) ans=0;
}
}
j--;
//以上过程将十六进制转化为二进制的逆置形式
for(;bin[j]=='0';j--); //倒数第一个不为零的数
bin[++j]='\0'; //形成字符串,方便使用函数将其逆置为正常的二进制
reverse(bin); //逆置
n=strlen(bin); //判断有多少位 每三位转化为一位八进制的数
if(n%3==1) //判断多出来几位
printf("%c",bin[0]);
else if(n%3==2)
printf("%d",(bin[0]-'0')*2+bin[1]-'0');
for(i=n%3;i<n;i+=3)
printf("%d",(bin[i]-'0')*4+(bin[i+1]-'0')*2+bin[i+2]-'0'); //每三位转化为一位八进制的数
printf("\n");
}
return 0;
}
蓝桥杯基础练习题十六进制转八进制
最新推荐文章于 2022-03-22 20:52:29 发布