蓝桥杯java:基础练习 十六进制转八进制

20 篇文章 0 订阅
11 篇文章 1 订阅

蓝桥杯java:基础练习 十六进制转八进制

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

解:
以十进制作为中间桥梁行不通,题目要求每个十六进制数长度不超过100000,转成十进制存不下来。
因此考虑转为二进制,再转成八进制。

public class test {
	public static void main(String args[]) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		String arr[] = new String[n];
		for(int i = 0;i < n;i++) {
			arr[i] = input.next();
		}
		input.close();//防止资源泄露
		for(int i = 0;i < arr.length;i++) {
			String s = HextoOct(arr[i]);
			System.out.println(s.replaceFirst("0", ""));//使用给定的参数 replacement 替换字符串第一个匹配给定的正则表达式的子字符串。
		}
	}

	private static String HextoOct(String s) {
		StringBuffer s1=new StringBuffer("");
		//十六进制转二进制
		for(int i=0;i<s.length();i++) {
			switch(s.charAt(i)) {//charAt(int index)用来检索特定索引下的字符的String实例.
			case '0':s1.append("0000");break;
			case '1':s1.append("0001");break;
			case '2':s1.append("0010");break;
			case '3':s1.append("0011");break;
			case '4':s1.append("0100");break;
			case '5':s1.append("0101");break;
			case '6':s1.append("0110");break;
			case '7':s1.append("0111");break;
			case '8':s1.append("1000");break;
			case '9':s1.append("1001");break;
			case 'A':s1.append("1010");break;
			case 'B':s1.append("1011");break;
			case 'C':s1.append("1100");break;
			case 'D':s1.append("1101");break;
			case 'E':s1.append("1110");break;
			case 'F':s1.append("1111");break;
			}
			
		}
		s = s1.toString();
		//字符的长度如果不能整除3,则需要在转换的结果前补0;
		if (s.length()%3 == 1)
			s = "00"+s;
		else if(s.length()%3 == 2)
			s = "0"+s;

		StringBuffer s2 =new StringBuffer("");
		//二进制转八进制
		for(int i = 0;i < s1.length();i+=3) {
			String str = s.substring(i, i+3);//substring(x,y)是从x到y前的位置停止
			switch(str) {
			case "000":s2.append('0');break;
			case "001":s2.append('1');break;
			case "010":s2.append('2');break;
			case "011":s2.append('3');break;
			case "100":s2.append('4');break;
			case "101":s2.append('5');break;
			case "110":s2.append('6');break;
			case "111":s2.append('7');break;
			}
		}
		return s2.toString();
	}
}

charAt:是一个能够用来检索特定索引下的字符的String实例的方法.
例如:str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符.

replaceFirst():使用给定的参数 replacement 替换字符串第一个匹配给定的正则表达式的子字符串。
语法

public String replaceFirst(String regex,String replacement);

参数:
regex – 匹配此字符串的正则表达式。
replacement – 用来替换第一个匹配项的字符串。
返回值:
成功则返回替换的字符串,失败则返回原始字符串。

substring(int beginIndex, int endIndex:是从x到y前的位置停止。
1、取得的字符串长度为:endIndex - beginIndex;
2、从beginIndex开始取,到endIndex结束,从0开始数,其中不包括endIndex位置的字符。

代码和思路是学习这位博主的:
https://blog.csdn.net/qq_41500251/article/details/85058159
网上看了很多版本的代码解法,感觉这个博主讲得很好,很清晰易懂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值