题目链接:2进制转化为16进制
总时间限制: 1000ms
内存限制: 65536kB
描述
输入一个2进制的数,要求输出该2进制数的16进制表示。
在16进制的表示中,A-F表示10-15
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000
输出
n行,每行输出对应一个输入。
样例输入
2 100000 111
样例输出
20 7
问题分析:
根据进制转换原理,转换时二进制的四位对应十六进制的一位。
程序说明:
1.用字符数组s[]存放输入的二进制数,为了方便按位转换,在数组前面加4个“0”。转换时从后往前四位四位地转换。
2.用convert[]存放十六进制对应的字符。
C语言程序如下:
/* Bailian2798 2进制转化为16进制 */
#include <stdio.h>
#include <string.h>
#define N 10000
#define N2 4
char s[N + N2 + 1];
char convert[] = "0123456789ABCDEF";
int main(void)
{
int n, len, digits, i, k;
scanf("%d", &n);
getchar();
while(n--) {
gets(s + N2); //读入字符串从s[0+N2],即s[4]开始保存。
s[0] = s[1] = s[2] = s[3] = '0'; //令前四位为0
len = strlen(s + N2); // 2进制位数
digits = (len + N2 - 1) / N2; // 16进制位数
len += N2 - 1;
for(i=1, k=len; i<=digits; i++) {
s[k--] = convert[(s[len-3]-'0')*8 + (s[len-2]-'0')*4 + (s[len-1]-'0')*2 + (s[len]-'0')];
len -= N2;
}
printf("%s\n", &s[k + 1]);
}
return 0;
}