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

2进制转化为3进制

 

描述

输入一个2进制的数,要求输出该2进制数的16进制表示。
在16进制的表示中,A-F表示10-15

输入

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000

输出

n行,每行输出对应一个输入。

样例输入

2
100000
111

样例输出

20
7

 

 

 

问题链接Bailian2798 2进制转化为16进制

问题简述: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;
}

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值