搜索
您的当前位置:首页正文

基础练习 十六进制转八进制

来源:意榕旅游网


基础练习 十六进制转八进制

时间限制:1.0s 内存限制:512.0MB

问题描述

给定n个十六进制正整数,输出它们对应的八进制数。

输入格式

输入的第一行为一个正整数n (1<=n<=10)。

接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

输出n行,每行为输入对应的八进制正整数。

注意

输入的十六进制数不会有前导0,比如012A。

输出的八进制数也不能有前导0。

样例输入

2

39

123ABC

样例输出

71

4435274

提示

先将十六进制数转换成二进制数,再由二进制数转换成八进制。

程序:

#include

#include

#include

#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);

}

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top