Bailian2798 2进制转化为16进制【进制转换】

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/fyy_lufan/article/details/81155660