蓝桥杯——BASIC-12——十六进制转八进制

通过万岁!!!

  • 题目:给定一个16进制的数,转换成八进制。
  • 思路:这个题不要试图什么数学方法,就是我们先转换成2进制,16禁止转换到2禁止,需要2进制的4位,然后再每次拿三个,转换成八进制。
  • 技巧:使用map存储16进制对应的2进制,然后另外一个map存储2进制对应的8进制。
  • 题目链接:http://lx.lanqiao.cn/problem.page?gpid=T51
  • 举例:123ABC->0001,0010,0011,1010,1011,1100->000,100,100,011,101,010,111,100->04435274->4435274.

java代码

import java.util.HashMap;
import java.util.Scanner;

/**
* @创建人 xcs
* @创建日期 2022/3/5
* @创建时间 20:34
* 题目链接:http://lx.lanqiao.cn/problem.page?gpid=T51
*/
public class BASIC12 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = Integer.parseInt(scan.nextLine());
        String[] numStr = new String[n];
        for (int i = 0; i < n; i++) {
            numStr[i] = scan.nextLine();
        }
        // 16进制转2进制map
        HashMap<Character, String> sixteenMap = new HashMap();
        sixteenMap.put('0', "0000");
        sixteenMap.put('1', "0001");
        sixteenMap.put('2', "0010");
        sixteenMap.put('3', "0011");
        sixteenMap.put('4', "0100");
        sixteenMap.put('5', "0101");
        sixteenMap.put('6', "0110");
        sixteenMap.put('7', "0111");
        sixteenMap.put('8', "1000");
        sixteenMap.put('9', "1001");
        sixteenMap.put('A', "1010");
        sixteenMap.put('B', "1011");
        sixteenMap.put('C', "1100");
        sixteenMap.put('D', "1101");
        sixteenMap.put('E', "1110");
        sixteenMap.put('F', "1111");
        // 二进制转八进制map
        HashMap<String, String> eightMap = new HashMap();
        eightMap.put("000", "0");
        eightMap.put("001", "1");
        eightMap.put("010", "2");
        eightMap.put("011", "3");
        eightMap.put("100", "4");
        eightMap.put("101", "5");
        eightMap.put("110", "6");
        eightMap.put("111", "7");

        // 2进制数存储在sb中
        StringBuilder sb;

        for (int i = 0; i < n; i++) {
            // 得到一个数
            sb = new StringBuilder();

            for (int j = 0; j < numStr[i].length(); j++) {
                sb.append(sixteenMap.get(numStr[i].charAt(j)));
            }

            // sb中已经是2进制存储了,补齐位数
            int length = sb.length();
            if (length % 3 == 1) {
                sb.insert(0, "00");
            } else if (length % 3 == 2) {
                sb.insert(0, "0");
            }
            // flag检测前面的0
            int flag = 0;
            for (int j = 0; j <= sb.length() - 3; j += 3) {
                String s = eightMap.get(sb.substring(j, j + 3));
                if (!"0".equals(s)) {
                    flag = 1;
                }
                if (flag == 1) {
                    System.out.print(s);
                }
            }
            System.out.println();
        }
    }
}
  • 总结::就是用一个二进制进行过渡。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值