大家都知道,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);
#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]);
{
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");
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;
}
水平很丑,代码又长又啰嗦,请原谅作者水平太臭。