进制转换:十六进制,二进制,八进制的互相转换

大家都知道,C语言有自带的十六进制八进制输入输出的格式转换符(我估计大家也不会用)。但是,当题目给出的数很大,超出了long long 的范围,这时候该怎么做呢?
我今天犯了思而不学则殆的错误,没有去百度找答案,自己想了好久,最后还是没有想出来,百度一下,卧槽,这么牛逼!这充分说明了先人的智慧是无穷的,我们一定要好好学习。

不多说了,直接说:因为16是2的四次方,所以直接把二进制的4位看作一个整体,对应16进制的16个数。8进制也是一样,把二进制的三位看作一个整体。


是不是很简单?
还有一些小技巧:1.当从小往大换(二进制到十六进制),最好编个函数,处理4个数对应的十六进制数。
2.当从大往小换的时候,用《算法竞赛入门经典》中介绍的方法,弄个常量字符串,检索其中的值。


下面是一道例题(见图)



#include<stdio.h>
#include<iso646.h>
#include<limits.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<ctype.h>
char shiliutoer[]="0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111";
char ertoba[]="000 001 010 011 100 101 110 111";
char shiliu[100010],er[400040];
int ba[150000];
int length_shiliu,tail_er,tail_ba,status;
int conversion(char input)
{
    int temp;
    if(isalpha(input))
        temp=input-'A'+10;
    else
        temp=input-'0';
    return temp;
}
int jisuan(char n1,char n2,char n3)
{
    int temp,a,b,c;
    a=n1-'0';
    b=n2-'0';
    c=n3-'0';
    temp=4*a+2*b+c;
    return temp;
}
int main(void)
{
    int i,j,n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",shiliu);
        length_shiliu=strlen(shiliu);
        tail_er=0;
        for(i=0;i<length_shiliu;i++)
            for(j=5*conversion(shiliu[i]);j<=5*conversion(shiliu[i])+3;j++)
              er[tail_er++]=shiliutoer[j];
        //printf("tail_er=%d\n",tail_er);


        tail_ba=1;
        if(tail_er%3==1)
        {
            ba[0]=er[0]-'0';
            for(j=1;j<tail_er;j=j+3)
                ba[tail_ba++]=jisuan(er[j],er[j+1],er[j+2]);
        }

        if(tail_er%3==2)
        {
            if((er[0]=='0') &&(er[1]=='1'))
               ba[0]=1;
            if((er[0]=='0')&&(er[1]=='0'))
                ba[0]=0;
            if((er[0]=='1')&& (er[1]=='0'))
                ba[0]=2;
            if((er[0]=='1')&&(er[1]=='1'))
                ba[0]=3;
            for(j=2;j<tail_er;j=j+3)
            ba[tail_ba++]=jisuan(er[j],er[j+1],er[j+2]);
        }
        if(tail_er%3==0)
        {
            ba[0]=jisuan(er[0],er[1],er[2]);
            for(j=3;j<tail_er;j=j+3)
                ba[tail_ba++]=jisuan(er[j],er[j+1],er[j+2]);

        }

        status=0;
        for(j=0;j<tail_ba;j++)
        {
            if(ba[j]!=0)
            {
                status=1;
                printf("%d",ba[j]);
            }
            if((ba[j]==0) &&(status==0))
                continue;
            if((ba[j]==0) &&(status!=0))
                printf("%d",ba[j]);
        }
        printf("\n");


    }
    return 0;

}

水平很丑,代码又长又啰嗦,请原谅作者水平太臭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值