2进制转16进制

题目描述

给定一个二进制表示的非负整数,将其转换为十六进制数。

输入

输入数据有多组,第一行为数据的组数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;
}

发布了37 篇原创文章 · 获赞 3 · 访问量 1195

猜你喜欢

转载自blog.csdn.net/qq_45721778/article/details/103723640