十六进制转八进制java_基础练习-十六进制转八进制 -JAVA蓝桥杯

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

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

问题描述

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

输入格式

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

输出格式

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

注意

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

样例输入

239123ABC

样例输出

714435274

提示

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

题解:

先把十六进制转成二进制,每位十六进制正好转成4位二进制,然后再将二进制转成八进制,每三个二进制转成一个八进制。

注意:

在将16进制转成2进制时,要使用StringBuilder,否则会超时因为String每次修改字符串都是新建,然后删除旧的串会很影响效率,而StringBuilder是在字符串的末尾操作。

代码:

import java.util.Scanner;

/*

*通过该类对象调用ChangToBit(char c)方法可返回2进制表示的字符串

*/

class Hexadecimal{

String[] hex={

"0000","0001","0010","0011","0100","0101","0110","0111",

"1000","1001","1010","1011","1100","1101","1110","1111"

};

public String ChangeToBit(char c){

if(c>='0'&&c<='9'){

return hex[c-'0'];

}

else return hex[c-'A'+10];

}

}

/*

* 通过调用该类对象的changeToOex(String astring)方法可返回该3位2进制串的8进制数值

*/

class Oex{

String[] oex={

"000","001","010","011","100","101","110","111"

};

public int changeToOex(String astring){

for(int i=0;i<8;i++){

if(oex[i].equals(astring)==true){

return i;

}

}

return 0;

}

}

public class Main {

/**

* @param args

*/

static Hexadecimal hex=new Hexadecimal();

static Oex oex=new Oex();

//将aString的位数在字符串开头补全为3的倍数,返回补全后的字符串

public static String BuQuanSanWei(String aString){

String ret="";

if(aString.length()%3==0) return aString;

if((aString.length()+1)%3==0){

ret+="0";

ret+=aString;

return ret;

}

ret+="00";

ret+=aString;

return ret;

}

public static void main(String[] args) {

Scanner scan=new Scanner(System.in);

int N=scan.nextInt();

while(N--!=0){

String aString=scan.next();

//必须用StringBuilder建立2进制字符串,否则由于需建立的字符太长会超时

StringBuilder bitStringbuilder=new StringBuilder();

for(int i=0;i

bitStringbuilder.append(hex.ChangeToBit(aString.charAt(i)));

}

//补全位数为3的倍数

String bitString=BuQuanSanWei(bitStringbuilder.toString());

//标记是否有输出

int hasOut=0;

for(int i=0;i

String nowCun="";

nowCun+=bitString.charAt(i);

nowCun+=bitString.charAt(i+1);

nowCun+=bitString.charAt(i+2);

int Num=oex.changeToOex(nowCun);

if(i==0&&Num==0) continue;

hasOut=1;

System.out.print(Num);

}

if(hasOut==0) System.out.print("0");

System.out.println();

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值