您的位置:首页 > 其它

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

2016-01-30 13:56 621 查看
大家都知道,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;

}

水平很丑,代码又长又啰嗦,请原谅作者水平太臭。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: