题目描述
给定一个二进制表示的非负整数,将其转换为十六进制数。
输入
输入数据有多组,第一行为数据的组数T,接下来有T组数据。
每组数据占一行,每行为一个二进制整数(不含多余的前导0),最多1000位。
输出
输出对应的十六进制数,字母用大写表示。
样例输入
2
1111
10100100
样例输出
F
A4
2进制转16进制,就是从低位开始,每四位一组,分别乘以2^0, 2^1, 2^2 , 2^3
不足4位往前面补0**
#include<stdio.h>
#include<string.h>
int main()
{
int t,k,num,q,i,b[1100],x,h;
char a[1100];
while(scanf("%d",&t)!=EOF)//有t组测试数据
{
while(t--)
{
memset(a,0,sizeof(a));//清空a,b数组
memset(b,0,sizeof(b));
scanf("%s",a);
k=0;
num=strlen(a)/4;
q=0;
x=strlen(a);
for(i=0;i<num;i++)
{
b[q]=(a[x-4*i-1]-'0')+(a[x-4*i-2]-'0')*2+(a[x-4*i-3]-'0')*4+(a[x-4*i-4]-'0')*8;//四位一组转化为16进制
q++;
}
if(strlen(a)%4!=0)
{
h=1;
for(i=x-4*num-1;i>=0;i--)
{
b[q]+=(a[i]-'0')*h;
h=2*h;
}
q++;
}
for(i=q-1;i>=0;i--)
{
if((b[i]>=10)&&(b[i]<=15))
{
printf("%c",b[i]-10+'A');
}
else
{
printf("%d",b[i]);
}
}
printf("\n");
}
}
return 0;
}