#define MAXsize 100000
void savebin(char *b,char *ch,int index)//保存二进制01字串
{
b[index]=ch[0];
b[++index]=ch[1];
b[++index]=ch[2];
b[++index]=ch[3];
}
void hextobin(char *h,char *b)//十六进制转二进制
{
char t[16][5]=
{
\"0000\
\"1000\
};
int i = 0;
for(;h[i]!='\\0';i++)
{
switch(h[i])
{
case '0':{savebin(b,t[0],i*4);break;}
case '1':{savebin(b,t[1],i*4);break;}
case '2':{savebin(b,t[2],i*4);break;}
case '3':{savebin(b,t[3],i*4);break;}
case '4':{savebin(b,t[4],i*4);break;}
case '5':{savebin(b,t[5],i*4);break;}
case '6':{savebin(b,t[6],i*4);break;}
case '7':{savebin(b,t[7],i*4);break;}
case '8':{savebin(b,t[8],i*4);break;}
case '9':{savebin(b,t[9],i*4);break;}
case 'A':{savebin(b,t[10],i*4);break;}
case 'B':{savebin(b,t[11],i*4);break;}
case 'C':{savebin(b,t[12],i*4);break;}
case 'D':{savebin(b,t[13],i*4);break;}
case 'E':{savebin(b,t[14],i*4);break;}
case 'F':{savebin(b,t[15],i*4);break;}
}
}
b[4*i] = '\\0';
}
void bintooct(char *b,char *o)
{
int i,j;
int bl,ol;
//确定八进制数的长度
bl = strlen(b);
ol = ceil(bl / 3.0);
//将二进制从高位向低位转换,逆序保存
j = bl - 1;
i = ol - 1;
for(; i >= 0; --i, j -= 3)
{
if(i > 0)
{
o[i]=b[j]+(b[j-1]-48)*2+(b[j-2]-48)*4; //权位值从低到高为:1 2 4
}
else
{
switch(j)
{
case 0:{o[i]=b[j];break;}//说明只有一位二进制数
case 1:{o[i]=b[j]+(b[j-1]-48)*2;break;}//说明还有两位二进制数
case 2:{o[i]=b[j]+(b[j-1]-48)*2+(b[j-2]-48)*4;break;}//说明还有三位二进制数
}
}
}
o[ol] = '\\0';
}
void print(char *o)//打印八进制
{
int i = 0;
while(o[i]=='0')//排除首位为‘0’的情况{
++i;
}
printf(\"%s\\n\
}
int main()
{
char h[MAXsize]; //建立十六进制数组,长度为10万
char b[MAXsize*4+1]; //建立二进制数组,长度为4倍十六进制长度
char o[MAXsize*4/3+1]; int i,n;
scanf(\"%d\
getchar();
for(i=0;i{gets(h);
hextobin(h,b);
bintooct(b,o);
print(o);
//建立八进制数组
}
return 0;
}
JAVA程序:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class B5 {
public static void main(String[] args) {
int n,m;char x;
String[]s={\"0000\001\
StringBuffer sb;
String ss,zero=\"0000\";
char a[]=new char[400002];
List num;Scanner sc=new Scanner(System.in);
n=sc.nextInt();
for(int i=0;iss=sc.next();long time1 = System.currentTimeMillis();
sb=new StringBuffer();num=new ArrayList();for(int j=0;jx=ss.charAt(j);m=Integer.parseInt(String.valueOf(x),16);
sb.append(s[m]);
}
m=sb.length()%3;
sb.insert(0,zero.subSequence(0, 3-m));
a=sb.toString().toCharArray();
for(int j=0,k=0;jnum.add(Character.digit(a[j],2)*4+Character.digit(a[j+1],2)*2+Character.digit(a[j+2],2));m=0;
for(int j=0;jif(num.get(m)==0)m++;else
System.out.print(num.get(j));
}
System.out.println();
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
}
}