十六进制转八进制

package org.bluebridge.lx;

/*
 * 十六进制转八进制  

 问题描述
 给定n个十六进制正整数,输出它们对应的八进制数。
 输入格式
 输入的第一行为一个正整数n (1<=n<=10)。
 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
 输出格式
 输出n行,每行为输入对应的八进制正整数。
 注意
 输入的十六进制数不会有前导0,比如012A。
 输出的八进制数也不能有前导0。
 样例输入
 2
 39
 123ABC
 样例输出
 71
 4435274
 * */

import java.util.Scanner;

public class BASIC_12 {
	static String bin[] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100",
			"1101", "1110", "1111" };

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int n = Integer.parseInt(sc.nextLine());

		String[] data = new String[n];
		for (int i = 0; i < data.length; i++)
			data[i] = sc.nextLine();
		sc.close();
		for (int i = 0; i < n; i++) {
			tobin(data[i].toCharArray());
		}
	}
	
	// 转成二进制
	private static void tobin(char[] data) {
		StringBuilder two = new StringBuilder();
		for (int j = 0; j < data.length; j++) {
			int index = (int) data[j];
			index = index <= 57 ? index - 48 : index - 55;
			two.append(bin[index]);
		}

		// 去掉二进制前面的0
		for (int j = 0; j < two.length(); j++)
			if (two.charAt(j) != '0') {
				two = two.delete(0, j);
				break;
			}
		tooct(two);
	}

	//转成八进制
	private static void tooct(StringBuilder two) {
		int c0 = two.length() % 3;
		if (c0 == 1)
			two.insert(0, "00");
		else if (c0 == 2)
			two.insert(0, "0");

		int n = two.length() / 3;
		String temp = "";
		StringBuilder octstr = new StringBuilder();
		for (int j = 0; j < n; j++) {
			temp = two.substring(j * 3, j * 3 + 3);
			switch (temp) {
			case "000":
				octstr.append("0");
				break;
			case "001":
				octstr.append("1");
				break;
			case "010":
				octstr.append("2");
				break;
			case "011":
				octstr.append("3");
				break;
			case "100":
				octstr.append("4");
				break;
			case "101":
				octstr.append("5");
				break;
			case "110":
				octstr.append("6");
				break;
			case "111":
				octstr.append("7");
				break;
			}
		}
		System.out.println(octstr);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值