基础练习 十六进制转八进制

Problem:

Hint: 

//这里我被坑了好久,发现自己把八进制前导的0以及后面的0全部不显示了,后面改过来就好了

  1. 先将十六进制转化为二进制//由于数据实在是太大,所以不转化为十进制了,因为long这个数据类型根本存不下十六进制转化为十进制的数,而如果使用大数类的话存转化后的十进制数再将它转化为八进制会超时
  2. 再将二进制转化为八进制(每三位转化为一个八进制数,若转化为二进制后不够被三整除,需要往前面补上前导的0)
  3. 二进制转化为八进制的时候需要注意的是前导的0不显示,后面的0正常显示(就是被这里坑了QWQ)

AcCode: 

import java.util.Scanner;

public class Main{
	/**
	 * 16进制转化为2进制
	 * @param hexString
	 * @return
	 */
	public static String hextoBin(String hexString) {
		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < hexString.length(); i++) {
			switch (hexString.charAt(i)) {
			case '0':
				builder.append("0000");
				break;
			case '1':
				builder.append("0001");
				break;
			case '2':
				builder.append("0010");
				break;
			case '3':
				builder.append("0011");
				break;
			case '4':
				builder.append("0100");
				break;
			case '5':
				builder.append("0101");
				break;
			case '6':
				builder.append("0110");
				break;
			case '7':
				builder.append("0111");
				break;
			case '8':
				builder.append("1000");
				break;
			case '9':
				builder.append("1001");
				break;
			case 'A':
				builder.append("1010");
				break;
			case 'B':
				builder.append("1011");
				break;
			case 'C':
				builder.append("1100");
				break;
			case 'D':
				builder.append("1101");
				break;
			case 'E':
				builder.append("1110");
				break;
			case 'F':
				builder.append("1111");
				break;
			default:
				break;
			}
		}
		if(builder.length()%3==1) {
			return "00"+builder.toString();
		}else if(builder.length()%3==2) {
			return "0"+builder.toString();
		}
		return builder.toString();
	}
	/**
	 * 二进制转换为8进制
	 * @param binString
	 * @return
	 */
	public static String bintoOct(String binString) {
		StringBuilder builder = new StringBuilder();
		int result = (binString.charAt(0) - '0') * 4 + (binString.charAt(1) - '0') * 2 + (binString.charAt(2) - '0');
		if(result!=0) {
			builder.append(result);
		}
		for (int i = 3; i < binString.length(); i+=3) {
			result = (binString.charAt(i) - '0') * 4 + (binString.charAt(i + 1) - '0') * 2 + (binString.charAt(i + 2) - '0');
				builder.append(result);
		}
		return builder.toString();
	}
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		while (n != 0) {
			String hexString = in.next();
			String binString = hextoBin(hexString);
			System.out.println(bintoOct(binString));
			n--;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值