描述
输入一个2进制的数,要求输出该2进制数的16进制表示。
在16进制的表示中,A-F表示10-15
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000
输出
n行,每行输出对应一个输入。
样例输入
2
100000
111
样例输出
20
7
问题简述:2进制转16进制,每4位变成1位。
问题分析:
2进制数的位数事先是不知道的,为了整齐在2进制数的前面加4个'0',以便于转换。
转换的结果放入同一数组中,需要合适的数组下标计算。
16进制值转换为16进制字符,使用查表方式实现(也可以用程序逻辑实现),使用了数组convert[]。
程序说明:(略)
题记:(略)
AC的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] = s[1] = s[2] = s[3] = '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;
}