蓝桥杯-十六进制转八进制

package jiChu;
/**
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274
 */
import java.util.Scanner;

public class SixteenToEight {

	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
        int n=input.nextInt();
        String [] result=new String[11];       //保存最后输出的结果
        for(int i=0;i<n;i++){
        	//十六进制转换为二进制
            String h=input.next();          //输入每一个十六进制数
            StringBuilder tempB=new StringBuilder();    //存储二进制
            for(int j=0;j<h.length();j++){
                char numH=h.charAt(j);     //截取每一位字符
                String b=Integer.toBinaryString(Integer.valueOf(String.valueOf(numH), 16));  //String.valueOf(char)是将char类型转换为String型,Integer.valueOf(string,int)是将string类型数据按照int进制解析成十进制,Integer.toBinaryString(int)是将int型转换成二进制
                for(int k=b.length();k<4;k++){     //将转换来的二进制数进行填空前置0(如3转换为11要填充为0011)
                    b='0'+b;
                }
                tempB.append(b);    //将每一个字符转换的二进制四位四位合并
            }
            
            //二进制转化为八进制
            StringBuilder tempO=new StringBuilder();    //存储八进制
            int addZero=3-tempB.length()%3;  //长度变为3的倍数,需要补的前导0的个数
            for(int j=0;j<addZero;j++){
                tempB=new StringBuilder("0").append(tempB);    //在前边追加0
            }
            for(int j=0;j<tempB.length();j+=3){
                String numB=tempB.substring(j, j+3);    //将二进制数据按照三位一组取出
                String o=Integer.toOctalString(Integer.valueOf(numB, 2));   //将string类型数据按2进制解析成十进制,Integer.toOctalString(Integer)再将十进制转换为八进制
                tempO.append(o);    //八进制数据,追加
            }
            result[i]=tempO.toString().replaceAll("^(0+)", "");//用正则表达式去掉前导零
        }
        input.close();
        for(int i=0;i<n;i++){
            System.out.println(result[i]);
        }

	}
}

觉得这个题真的不简单,起码对我这等渣渣来说,又是参考的网上的代码,好在每一句都研究懂了

1.该题的思想是十六进制-(十进制)->二进制->(十进制)->八进制,也就是说,主要是通过二进制转换,但是十进制起到了过渡作用,并没有实际操作

2.几个重要的方法:(小写代表该类型数据变量,大写代表该类)

  (1)String.valueOf(char)是将char类型转换为String型;

  (2)Integer.valueOf(string,int)是将string类型数据按照int进制解析成十进制;

  (3)Integer.toBinaryString(int)是将int型转换成二进制;

  (4)Integer.toOctalString(integer)再将十进制转换为八进制;

  (5)string.toString().replaceAll("^(0+)", "");可以去掉字符串前边的0

3.当字符串类型需要经常更改时,使用StringBuilder比较方便;


一开始时使用了Java自带的禁止转换方法,直接十六进制->十进制->八进制,但是提交出错,是超出最大值,所以当数据属于long范围内时,使用自带的方法也可

	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		String[] sixteen=new String[n];
		long[] ten=new long[n];
		String[] eight=new String[n];
		for(int i=0;i<n;i++) 
			sixteen[i]=input.next();
		input.close();
		for(int i=0;i<n;i++) {
			ten[i]=Long.parseLong(sixteen[i],16);   //十六进制转换为十进制
			eight[i]=Long.toString(ten[i],8);     //十进制转换为八进制
			System.out.println(eight[i]);
		}
	}

1.Integer.parseInt(string,int)或者Long.parseLong(string,int) 都是将string数据按照int进制标准转换为十进制

2.Integer.toString(int,int)或者Long.toString(long,int)都是将int或者long类型按照int(第二个参数)进制标准转换成字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值