蓝桥杯”试题集-试题 基础练习 十六进制转八进制

本文介绍了一种将十六进制数转换为八进制数的算法,通过先将十六进制转换为二进制,再由二进制转换为八进制的过程。提供了详细的Java代码实现,包括使用StringBuilder进行字符串操作和BigInteger类进行大数转换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“蓝桥杯”试题集-试题 基础练习 十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

***【*提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

重点:

提示中 某进制数 是十进制吗?

Java中 Integer对象中有进制转换方法

10进制转化其他进制 对应的方法,参数:n(原10进制数据),r(进制), 返回值
10进制转2进制 Integer.toBinaryString(n); 一个二进制字符串.
10进制转8进制 Integer.toOctalString(n); 一个八进制字符串
10进制转16进制 Integer.toHexString(n); 一个16进制字符串
10进制转 r 进制 Integer.toString(100, 16); 一个r进制字符串

r进制转10进制 Integer.valueOf(s, radix)

r进制转10进制 Integer.parseInt(String s ,int radix)

两者区别 Integer.valueOf()返回值为Integer类型,parseInt返回的是int类型

限制:radix取值范围为2 - 36,s限制长度为7

两者详细区别请:https://blog.youkuaiyun.com/jerry_player/article/details/105556090

由于Integer.valueOf(s, radix) (或 Integer.parseInt(String s ,int radix))在进制转化时的天然缺陷 在本题 每个十六进制数长度不超过100000 的条件下是不可用的。

根据本人经验,这里 某进制应该为二进制,所以可能是先将十六进制串转化为二进制串,再根据某种特性转化为八进制串。

以36(16)为例说明转化思路:

十六进制换成二进制数

3(16) = 0011(2)

6(16) = 0110(2)

36(16) = 0011 0110(2)

二进制转 八进制 (从后往前看)

110(2) = 6 (8)

110 (2) = 6 (8)

000(2) = 0 (8) 这里在最前面补0

0011 0110(2) = 66(8) 这里去除高位的0

代码实现:

package jinzhizhuanghua;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Integer  n = sc.nextInt();
		String arr[] = new String[n];  //存储输入的数 / 中间 保存 二进制串
		List<String> hexList = new ArrayList<String>();  // 0-15 的 十六进制表示
		List<String> binList = new ArrayList<String>();	 // 0-15 的 二进制表示
		String result[] = new String[n];   // 八进制结果
		StringBuilder sBuilder = new StringBuilder();    // 保存二进制串 转为 八进制串
		for (int i = 0; i < 16; i++) {
			String binString = Integer.toBinaryString(i);
			if (binString.length() < 2 ) {
				binString = "000" + binString;				
			}
			else if (binString.length() < 3 ) {
				binString = "00" + binString;
			}
			else if (binString.length() < 4) {
				binString = "0" + binString;
			}
			String hexString = Integer.toHexString(i).toUpperCase();
			hexList.add(hexString);
			binList.add(binString);
		}
		for( int i = 0 ; i < n; i++)
		{			
			arr[i] = sc.next();		
		}		
		//把所有 十六进制转化为 二进制数
		for (int i =0;i < n ; i++) {
			for (int j = 0; j < binList.size(); j++) {
				arr[i] = arr[i].replace(hexList.get(j), binList.get(j));
			}
		}
		
		for (int j = 0 ; j < n ; j++) {
			for(int i = arr[j].length(); i >0 ;i = i - 3)
			{
				String temp = null;
				if (i - 3 >= 0 ) {
					 temp = arr[j].substring(i - 3, i);
				}
				else {
					temp = arr[j].substring(0, i);
				}
				 //二进制转十进制
				Integer tempInteger = Integer.parseInt(temp, 2);
				temp = Integer.toOctalString(tempInteger);
				if (i - 3 > 0 ||  !"0".equals(temp)) {
					sBuilder.append(temp);	
				}		
			}	
			result[j] = sBuilder.reverse().toString();
			sBuilder.delete(0, sBuilder.length());
		}
		for (String string : result) {
			System.out.println(string);
		}
	}
}

思路二:(做成的小伙伴可以交流一下)
利用 BigInteger 实现进制转换。
利用BigInteger 实现进制转换比较简单,注释很详细。

import java.math.BigInteger;

/*
 * BigIntegerArbitraryConversion
 */
public class BigIntegerArbitraryConversion {
	public static void main(String[] args) {
		System.out.println(change("1410", 8, 2));   // 八进制转二进制
		System.out.println(change("1410", 8, 10));  // 八进制转十进制
		System.out.println(change("1410", 8, 16));  // 八进制转十六进制
	}

	/**
	 * number   要转换的数    
	 * from     原数的进制     
	 * to       要转换成的进制
	 */
	private static String change(String number, int from, int to) {
		return new BigInteger(number, from).toString(to);
	}
}

参考博客:
https://blog.youkuaiyun.com/qq_40358862/article/details/88934619
https://blog.youkuaiyun.com/jerry_player/article/details/105556090

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值