蓝桥杯——基础练习——BASIC-12——十六进制转八进制

我的蓝桥杯代码仓:https://github.com/617076674/lanqiao

题目描述:

知识点:进制转换

思路:先将十六进制转换成二进制,再将二进制转换成八进制

为防止超时,用一个数组来保存十六进制和二进制间的对应关系,用一个哈希表来保存二进制和八进制间的对应关系。

由于在二进制转八进制的过程中,为方便处理,我将字符串翻转了,所以哈希表中存储的是逆序的二进制序列和其对应的八进制值。由于翻转后会存在字符串末端不足3位的情况,因此哈希表中的键需要包含2个字符及1个字符的二进制序列。

JAVA代码:

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

public class Main {
	private static String[] hexToBinary = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
			"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
	private static HashMap<String, String> binaryToOct;	//存储逆序的2进制序列和对应的8进制值
	static {
		binaryToOct = new HashMap<String, String>();
		binaryToOct.put("000", "0");
		binaryToOct.put("100", "1");
		binaryToOct.put("010", "2");
		binaryToOct.put("110", "3");
		binaryToOct.put("001", "4");
		binaryToOct.put("101", "5");
		binaryToOct.put("011", "6");
		binaryToOct.put("111", "7");
		binaryToOct.put("00", "0");
		binaryToOct.put("10", "1");
		binaryToOct.put("01", "2");
		binaryToOct.put("11", "3");
		binaryToOct.put("0", "0");
		binaryToOct.put("1", "1");
	}
	public static void main(String[] args) throws Exception {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		scanner.nextLine();
		for(int i = 0; i < n; i++) {
			System.out.println(toOct(toBinary(scanner.nextLine())));
		}
	}
	
	private static String toBinary(String s) {
		StringBuilder result = new StringBuilder();
		for(int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if(c >= 'A' && c <= 'F') {
				result.append(hexToBinary[c - 'A' + 10]);
			}else {
				result.append(hexToBinary[c - '0']);
			}
		}
		while(result.charAt(0) == '0') {	//删除前导0
			result.deleteCharAt(0);
		}
		return result.toString();
	}
	
	private static String toOct(String s) {
		StringBuilder result = new StringBuilder();
		StringBuilder input = new StringBuilder(s);
		input.reverse();
		for(int i = 0; i < input.length(); i += 3) {
			result.append(binaryToOct.get(input.substring(i, Math.min(i + 3, input.length()))));
		}
		return result.reverse().toString();
	}
}

JAVA解题报告:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值