蓝桥杯练习系统之基础训练Java版(2-12)—— 十六进制转八进制

蓝桥杯练习系统之基础训练Java版(2-12)—— 十六进制转八进制

**难度等级:中等**

**关键字:进制转换 字符 循环**

问题描述:

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

输入格式:

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

输出格式:

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

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

样例输入:

2
39
123ABC

样例输出:

71
4435274

思路探索:

笔者刚开始的思路,即正常的思路是将十六进制转换成十进制,再由十进制转换成8进制,这个是我们学过进制转换的惯性思维,但是发现在提交代码后,显示运行错误,得了0分,经过output文件观察才知道,输入的十六进制数长度不超过100000。(用在线进制转换器也转换不了,哈哈)
在这里插入图片描述
于是,在笔者经历重重修改下,发现了不管怎么换类型都没用,正确的做法应该是如下:

先将十六进制数转换成二进制数进行存储,然后再提取出来,转换成八进制数(里面用到是每个十六进制数等于4个二进制数位,如:F == 1111,说16 == 10000拉出去闸了哈;每个八进制数等于3个二进制数位,如:7 == 0111

**注意:**代码中的else if不能用switch语句来代替,因为jdk1.6版本不支持哦!

代码如下:(应该可以有更简单的方式,笔者不会哈,只能用暴力破解法)

import java.util.Scanner;

public class Main {

    static String[] hex = { "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 s = new Scanner(System.in);
        int n = s.nextInt(); 			//输入n个十六进制正整数(0 <= n <= 10)
        String[] str = new String[n]; 	//用来接收十六进制数的数组

        //接收十六进制正整数
        for (int i = 0; i < n; i++) {
            str[i] = s.next();
        }

        for(int i = 0; i < n; i++) {
            String result = hexToBin(str[i]).toString(); 	//十六进制转换成二进制
            String octResult = binToOct(result); 			//二进制转换成八进制
            if(octResult.startsWith("0")) {
                octResult = octResult.substring(1);
                //substring(int beginIndex)作用:如果开头是startWith("0")里面的"0",则开始索引,直到最后一个"0",然后截取掉,返回字符串
                //例如:0000451513  -->  451513
            }
            System.out.println(octResult);
        }
    }

    //十六进制转换成二进制
    private static StringBuffer hexToBin(String str) {
        int len = str.length();
        int start = 0;
        int end = 1;
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < len; i++) {
            String subStr = str.substring(start, end); //抽取一个十六进制字符
            start++;
            end++;
            String s = transform(subStr); 				//将抽取的十六进制字符转换成二进制字符
            result.append(s);
        }
        return result;
    }

    //二进制转换成八进制
    private static String binToOct(String str) {
        int length = str.length();
        /*
        二进制字符串的长度不是3的整数倍的时候,在字符串的前面补上相应个数的"0",
        来让二进制字符串的长度变成3的整数倍
        */
        if(length % 3 == 1) {
            str= "00"+ str;
        } else if(length % 3 == 2) {
            str = "0"+ str;
        }

        int start = 0;
        int end = 3;
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < str.length()/3; i++) {
            String subStr = str.substring(start, end); //提取三个二进制字符
            start += 3;
            end += 3;
            String s = transform2(subStr); //将提取出来的二进制字符串转换成八进制字符
            sb.append(s);
        }
        return sb.toString();
    }

    //将提取出来的十六进制字符转换成二进制字符
    private static String transform(String str) {
        String result = "";

        if(str.equals("0")) result = hex[0];
        else if (str.equals("1")) result = hex[1];
        else if (str.equals("2")) result = hex[2];
        else if (str.equals("3")) result = hex[3];
        else if (str.equals("4")) result = hex[4];
        else if (str.equals("5")) result = hex[5];
        else if (str.equals("6")) result = hex[6];
        else if (str.equals("7")) result = hex[7];
        else if (str.equals("8")) result = hex[8];
        else if (str.equals("9")) result = hex[9];
        else if (str.equals("A")) result = hex[10];
        else if (str.equals("B")) result = hex[11];
        else if (str.equals("C")) result = hex[12];
        else if (str.equals("D")) result = hex[13];
        else if (str.equals("E")) result = hex[14];
        else if (str.equals("F")) result = hex[15];

        return result;
    }

    //将抽取的二进制字符串转换成八进制字符
    private static String transform2(String str) {
        String result = "";

            if(str.equals("000")) result = oct[0];
            else if (str.equals("001")) result = oct[1];
            else if (str.equals("010")) result = oct[2];
            else if (str.equals("011")) result = oct[3];
            else if (str.equals("100")) result = oct[4];
            else if (str.equals("101")) result = oct[5];
            else if (str.equals("110")) result = oct[6];
            else if (str.equals("111")) result = oct[7];

        return result;
    }
}

希望能对您有帮助!谢谢。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值