java: 十六进制转八进制

这是一个Java程序,用于将输入的十六进制正整数转换为八进制。程序首先将十六进制转换为二进制,然后将二进制转换为八进制。输入的十六进制数没有前导0,并且输出的八进制数也不会有前导0。示例输入包括'39'和'123ABC',对应的输出分别为'71'和'4435274'。
摘要由CSDN通过智能技术生成

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。
  代码实现:

  import java.util.Scanner; 

public class Main { 
	//定义常量字符串数组
	static String[] bin = { "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个十六进制正整数
		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")) {//查找索引是否从0开始 
				octResult = octResult.substring(1); 
			} 
			System.out.println(octResult);
		} 
	} 
	
	//十六进制转换成二进制
	private static StringBuffer hexToBin(String str) { 
		int length = str.length(); 
		int start = 0; 
		int end = 1; 
		StringBuffer result = new StringBuffer(); 
		for (int i = 0; i < length; 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(); 
		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 = ""; 
		switch (str) { 
			case "0": result = bin[0]; break; 
			case "1": result = bin[1]; break; 
			case "2": result = bin[2]; break; 
			case "3": result = bin[3]; break; 
			case "4": result = bin[4]; break; 
			case "5": result = bin[5]; break; 
			case "6": result = bin[6]; break; 
			case "7": result = bin[7]; break; 
			case "8": result = bin[8]; break; 
			case "9": result = bin[9]; break; 
			case "A": result = bin[10]; break; 
			case "B": result = bin[11]; break; 
			case "C": result = bin[12]; break; 
			case "D": result = bin[13]; break; 
			case "E": result = bin[14]; break; 
			case "F": result = bin[15]; break; 
			default: break; 
		} 
		return result; 
	} 
	
	//将抽取的二进制字符串转换成八进制字符
	private static String transform2(String str) { 
		String result = ""; 
		switch (str) { 
			case "000": result = oct[0]; break; 
			case "001": result = oct[1]; break; 
			case "010": result = oct[2]; break; 
			case "011": result = oct[3]; break; 
			case "100": result = oct[4]; break; 
			case "101": result = oct[5]; break; 
			case "110": result = oct[6]; break; 
			case "111": result = oct[7]; break; 
		} 
		return result; 
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊可同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值