十六进制转八进制 蓝桥杯基础题

Java练习

        小白刚开始准备蓝桥杯,代码中有很多不足,有些地方可以用更好的函数方法代替。思路是先将十六进制转为二进制,再将二进制转为八进制。


代码:

package com.dada.Q1;

import java.util.ArrayList;
import java.util.Scanner;

public class q1_3 {
    static String[] bin =  {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
    static String[] oct =  {"0","1","2","3","4","5","6","7"};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n =  sc.nextInt();
        String[] arr = new String[n]; //用来保存每一行的十六进制数
        for (int i = 0; i < n; i++) {
            arr[i] = sc.next();
        }
        String binaryCode ; //存储转换后的二进制
        String result;  //存储转换后的八进制
        for (int i = 0; i < n; i++) {
            binaryCode = trans(arr[i]); //将本行的十六进制数转为二进制字符串;
            //System.out.println(binaryCode);
             result = tooctal(binaryCode); //八进制处理
            while (result.substring(0,1).equals("0"))
            {
                result = result.substring(1); //去零
            }
            System.out.println(result);
        }
    }

    public static String trans(String hex) {
        char buffer; //存储单个十六进制字符
        ArrayList List = new ArrayList(); //存储转成的二进制字符
        for (int i = 0; i < hex.length(); i++) {
            buffer = hex.charAt(i);
            switch (buffer) //依次将每一个字符替换成二进制
            {
                case '0' : List.add(bin[0]); break;
                case '1' : List.add(bin[1]); break;
                case '2' : List.add(bin[2]); break;
                case '3' : List.add(bin[3]); break;
                case '4' : List.add(bin[4]); break;
                case '5' : List.add(bin[5]); break;
                case '6' : List.add(bin[6]); break;
                case '7' : List.add(bin[7]); break;
                case '8' : List.add(bin[8]); break;
                case '9' : List.add(bin[9]); break;
                case 'a' : case 'A': List.add(bin[10]); break;
                case 'b' : case 'B': List.add(bin[11]); break;
                case 'c' : case 'C': List.add(bin[12]); break;
                case 'd' : case 'D': List.add(bin[13]); break;
                case 'e' : case 'E': List.add(bin[14]); break;
                case 'f' : case 'F': List.add(bin[15]); break;
            }
        }
        return String.join("",List);
    }
    public static String tooctal(String binaryCode)
    {
        //前边添0
        int rmd =  binaryCode.length()%3;
        String inc = "";
        for (int i = 0; i < (3-rmd); i++) {
            inc+="0";
        }
        binaryCode = inc+binaryCode; //给二进制串前边补零

//        System.out.println(binaryCode);
        String son ;
        ArrayList array = new ArrayList();
        int i = 0;
        while(i<=binaryCode.length()-2) {
            son = binaryCode.substring(i,i+3); //循环获取三个字符
            i = i+3;
            switch (son)
            {
                case "000" : array.add(oct[0]); break;
                case "001" : array.add(oct[1]); break;
                case "010" : array.add(oct[2]); break;
                case "011" : array.add(oct[3]); break;
                case "100" : array.add(oct[4]); break;
                case "101" : array.add(oct[5]); break;
                case "110" : array.add(oct[6]); break;
                case "111" : array.add(oct[7]); break;
            }
        }
        return String.join("",array);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值