蓝桥杯-十六进制转八进制(Java)

article/2025/9/23 9:11:41

蓝桥杯-十六进制转八进制(Java)

最近在练习算法题,打算应付一下下学期的蓝桥杯,写写博客记录一下我的学习过程,对算法感兴趣的朋友可以给小编点点关注(重要的事情加上强调标志,o( ̄︶ ̄)o),这个假期,我会尽量多的把我遇到的有质量的算法题以博客的形式呈现给大家,算法题的难度也会是有难到易的增长的,希望在这个假期里我们能够共同进步,大家一起努力o( ̄︶ ̄)o
那废话也不多说了,咋们开始步入正题
先把这道题目展现给大家

我想再次写下我整个思考的过程,所以写的比较多,有的代码只是尝试的过程,有一些小问题(在讲解的过程中我也会说明原因的o( ̄︶ ̄)o),无法通过蓝桥杯的编译,如果着急想看解决方法的小伙伴可以直接看尝试三,这个代码可以直接通过编译。

第一次尝试:

其实就是把一个十六进制数转化成八进制,其实对于这道题我一开始思考的是相对比较常规的写法:把十六进制转化成十进制再将十进制转化成八进制。 这个是我当时用这种方法写的代码:

第一次尝试代码:
以十进制为媒介进行转化

import java.util.*;public class Main {public static void main(String[] args){Scanner sc = new Scanner(System.in);int n = sc.nextInt();String[] a = new String[n];for(int i=0;i<a.length;i++){a[i] = sc.next();}for(int i=0;i<a.length;i++){//将字符串转化成字符数组带入转化成十进制char b[] = a[i].toCharArray();Long m = num(b);zhuanhua(m);}}// 将十六进制转化为十进制public static long num(char a[]){long sum=0;for(int i=0;i<a.length;i++){if(a[i]<='9'&&a[i]>='0'){sum += (int)(a[i] - '0') * Math.pow(16, a.length-i-1);}else if(a[i]<='F' && a[i]>='A'){sum += ((int)(a[i] - 'A') + 10) * Math.pow(16, a.length-i-1);}}return sum;}//将十进制转化为八进制public static void zhuanhua(Long num){long sum = 0;long k = 1;while(num != 0){sum = sum + (num % 8) * k;num /= 8;k *= 10;}System.out.println(sum);}
}

但很可惜这种方法走不通,以为忽略了一个问题:当十六进制转化成十进制的时候,十进制这个媒介需要用数字来接收,那么可能就会出现这样一种情况十六进制的这个数很大以至于转化成十进制后用long型去接收都会溢出

第二次尝试:

那如果想不考虑数字大小完成转换,我们就不能选择用数字去接收,所以此时我就思考能不能有什么媒介,可以让他从始至终都使用字符进行转换,这个时候我就想起了二进制的特性o( ̄︶ ̄)o,二进制的话每相邻的四位是十六进制的一位,每相邻的三位是八进制的一位这样的话用二进制作为媒介就可以避开数字用字符串进行转换了,就可以避免数字溢出的情况了,下面把代码展现给大家:
第二次尝试代码:
以二进制为媒介进行转换

import java.util.Scanner;public class Main {public static void main(String[] args){Scanner sc = new Scanner(System.in);int n = sc.nextInt();String[] strs = new String[n];String str;for(int i=0;i<n;i++){strs[i] = sc.next();}for(int i=0;i<n;i++){str = to_2(strs[i]);to_8(str);}}//十进制转化成二进制public static String to_2(String a){char nums[] = a.toCharArray();String sum = "";String t;for(int i=0;i<nums.length;i++){// 每一位十六进制转换为四位二进制储存进字符串if(i!=0){switch(nums[i]){case '0': t= "0000"; break;case '1': t= "0001"; break;case '2': t= "0010"; break;case '3': t= "0011"; break;case '4': t= "0100"; break;case '5': t= "0101"; break;case '6': t= "0110"; break;case '7': t= "0111"; break;case '8': t= "1000"; break;case '9': t= "1001"; break;case 'A': t= "1010"; break;case 'B': t= "1011"; break;case 'C': t= "1100"; break;case 'D': t= "1101"; break;case 'E': t= "1110"; break;case 'F': t= "1111"; break;default : t= "";}}else{//i== 0即最高位单独判断避免最高位为0的情况出现switch(nums[i]){case '1': t= "1"; break;case '2': t= "10"; break;case '3': t= "11"; break;case '4': t= "100"; break;case '5': t= "101"; break;case '6': t= "110"; break;case '7': t= "111"; break;case '8': t= "1000"; break;case '9': t= "1001"; break;case 'A': t= "1010"; break;case 'B': t= "1011"; break;case 'C': t= "1100"; break;case 'D': t= "1101"; break;case 'E': t= "1110"; break;case 'F': t= "1111"; break;default : t= "";}}sum = sum + t;}return sum;}//将二进制转换为八进制public static void to_8(String a){//二进制转化为八进制之前先补零if(a.length()%3 == 2){a = "0" + a;}else if(a.length()%3 == 1){a = "00" + a;}int length = a.length()/3;char nums[] = a.toCharArray();int sum[] = new int[length];//每三位进行转换储存在字符数组中for(int i = 0 ; i < length ; i++){sum[i] = (int)(nums[3*i+2]-'0')+(int)(nums[3*i+1]-'0')*2+(int)(nums[3*i]-'0')*4;}for(int i = 0 ; i<length ; i++){// 输出字符数组System.out.print(sum[i]);}System.out.println();}
}

这种方法就可以解决掉溢出问题了,我在编译器上使用也没什么问题,就当我觉得已经解决了的时候新的问题出现了:因为代码不够简洁运行时时间超时了,但学C的小伙伴完全可以使用这种思路来写,C还是不容易超时的。

第三次尝试:

其实大致思路确实是这样但我忽略了一个很重要的东西,java有很多方法呀,咋们完全可以使用这些方法来解题。但在放代码时,考虑到大家可能跟我一样也忘了这些函数,我先用代码的方式简单的介绍一下这些方法:

public class Main1 {public static void main(String[] args){int n = 18;// 输出都是字符串System.out.println(n+"的二进制是:"+Integer.toBinaryString(n));System.out.println(n+"的八进制是:"+Integer.toOctalString(n));System.out.println(n+"的十六进制是:"+Integer.toHexString(n));System.out.println(n+"的三进制是:"+Integer.toString(n,3));}}

在了解进制转化的方法之后,我们就来看看怎么用方法来解决这个问题吧,代码如下:
第三次尝试代码:
运用方法将十六进制转换为二进制再转换为八进制

import java.util.Scanner;public class test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();for(int i=0;i<n;i++){String line = sc.next();StringBuilder builder = new StringBuilder();for(int k = 0 ; k < line.length() ; k++){//substring从beginIndex开始取,到endIndex结束,从0开始数,其中不包括endIndex位置的字符builder.append(HexToBin(line.substring(k, k+1)));}String bin = format3(builder.toString());builder = new StringBuilder();for (int j = 0; j < bin.length(); j+=3) {builder.append(BinToOct(bin.substring(j, j+3)));}String result = builder.toString();// 去除前面所有的零int m = 0;while(result.charAt(m) == '0'){result = result.substring(m+1);m++;}System.out.println(result);  }}// 十六进制转二进制public static String HexToBin(String hex) {//valueOf可以将基本类型int转换为包装类型Integer,或者将String转换成Integer,在这里把十六进制的字符串转化为十进制的int类型return format4(Integer.toBinaryString(Integer.valueOf(hex, 16)));}public static String BinToOct(String Bin){return Integer.toOctalString(Integer.valueOf(Bin,2));}// 十六进制转二进制补零public static String format4(String str){if(str.length()%4 == 3){str = "0" + str;}else if(str.length()%4 == 2){str = "00" + str;}else if(str.length()%4 == 1){str = "000" + str;}return str;}// 八进制补零public static String format3(String str){if(str.length()%3 == 2){str = "0" + str;}else if(str.length()%3 == 1){str = "00" + str;}return str; }}

对于蓝桥杯训练这道题来说只有第三种方法可以通过编译,之所以把三种方法都展示出来主要是想还原的我一个思考过程,希望能够给大家带来更多的帮助,其他两种方法跳出蓝桥杯编译环境的印象也是有可取性的,最后感谢大家的观看和支持,快要过年了,也在此祝大家新年快乐o( ̄︶ ̄)o


http://chatgpt.dhexx.cn/article/ZkDac6ap.shtml

相关文章

蓝桥杯C语言 十六进制转八进制

十六进制转八进制 思路分析&#xff1a; 39十六进制先转换为4位二进制&#xff0c;3为0011&#xff0c;9为1001&#xff0c;所以39的二进制为00111001,又把二进制转化为3位八进制&#xff0c;从右边开始数&#xff0c;001为1&#xff0c;111为7&#xff0c;所以39的八进制为71。…

十六进制转换八进制

问题描述 给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n &#xff08;1<n<10&#xff09;。   接下来n行&#xff0c;每行一个由09、大写字母AF组成的字符串&#xff0c;表示要转换的十六进制正整数&#xff0…

蓝桥杯练习:C语言十六进制转八进制

这题对我来说是有点难度的,最后做出来,但是提交显示 运行错误,看不出哪里出错了. 我的思路: 将十六进制转化为二进制,二进制最后转化为八进制. 首先将十六进制存入数组,然后将数组中每一位转化为对应的十进制数,之后将再将每一位十进制数转化为二进制数,将这些二进制数以每三…

C语言十六进制转八进制

思路&#xff1a;将十六进制先转为十进制再转为八进制 十六进制转十进制:与二进制转十进制类似。对十六进制每个数从左往右依次乘16的0,1,2,......并相加得到相应的十进制。 比如&#xff1a;对123ABC&#xff0c;1216&#xff08;0&#xff09;1116&#xff08;1&#xff09…

XPC U盘启动盘的制作

XPC U盘启动盘的制作 对于XPC目标机的启动&#xff0c;我们可以通过网络、硬盘或者 U盘启动目标机。这里介绍一下通过U盘的气动&#xff0c;因为这个相对而言比较简单。 选择一个4G以下的U盘&#xff0c;最好为2G选择一台XP系统的电脑&#xff08;最好为工控机&#xff0c;必…

XPC调试记录 :TwinCAT生成XML配置文件

XPC调试记录&#xff1a;生成XML配置文件20210316 1.连接目标控制器 硬件准备&#xff1a;用一根网线将配置有EtherCAT的电脑和EK1100&#xff08;BECOHOFF总线模块&#xff09;网线插槽X2(OUT)相连。&#xff08;正常初始化配置时对应指示灯闪烁&#xff09; &#xff08;1&a…

iOS 冰与火之歌 - 利用 XPC 过 App 沙盒

蒸米是阿里巴巴的移动安全工程师&#xff0c;香港中文大学博士&#xff0c;也是发现并命名了XcodeGhost的人。这次他所在的iOS安全小组发现了影响最新版iOS 9.3的0day漏洞。此漏洞杀伤力巨大&#xff0c;在非越狱手机上一个app应用可以利用这个漏洞做到读取或者修改沙盒外其他a…

xPC信号采集和分析(1)

背景介绍 在我的上篇文章用虚拟机在一台电脑上实现xPC实时仿真&#xff0c;进行xPC实时仿真的过程中&#xff0c;需要将仿真数据进行记录以便后续分析处理。xPC目标的信号采集过程是通过实时内核来完成的。实时应用程序的信号数据存储在目标机的RAM中&#xff0c;xPC目标程序支…

建模simulink - 手把手教你搭建xpc平台

概述 xpc半实物仿真目标是个基于RTW对低端实时仿真和开发平台,可将计算机或者工控机转变为一个实时系统,不需要第三方操作系统对支持,在计算机上配置输入输入出设备就能和外部交换信息,进行硬件再换仿真和测控系统开发。 目前mathworks已经放弃来xpc target这个说法,而改用…

xPC信号采集和分析(2)

背景介绍 上一篇文章xPC信号采集和分析&#xff08;1&#xff09;里面&#xff0c;解决了自己在使用第二种方法&#xff1a;信号记录模式对xPC数据进行记录过程中的一些问题。 然而很多情况下&#xff0c;我们需要采用第三种信号跟踪模式对实时任务中的数据进行实时传输并可视…

matlab中xpcapi库的调用,关于MATLAB中xpc实时控制平台搭建的心得

Xpc target主机—目标机通讯平台的搭建 一、用u盘制作XPC的目标启动盘 U盘启动盘制作的关键是找对dos系统软件包和相应的读写软件,我也是找了很久而不得要领。开始时,我是下载了一个网上的dos系统软件包,然后用ultriso写入u盘中,然而并不成功,试了几次后,才找到合适的软件…

建模simulink - xpc自定义模块

概述 在实际项目设计中,使用simulink提供的基本模块很难实现的时候,此时就需要一种用户可以自定义的方式,定做自己的模块。 在这种情况下,Matlab的s函数应运而生,S-函数是系统函数(System Function)的简称,又称S-function,支持用户使用C语言、C++、Matlab等语言编写自己…

simulink模块,提供xpctarget下驱动源码

simulink模块&#xff0c;提供xpctarget下驱动源码 :77999632700099250风中的蜗牛

建模simulink - xpc自定义模块设置

概述 simulink建模不同于代码编程,整个项目以模块/模型为单元展开,在之前的文章中,小编已经介绍过如何自定义模块,以及设置参数等信息,不懂的小伙伴可以先移步看看以前的文章,正因为simulink的这种特性,所以此时模块/模型的展示信息就显得尤为重要。 注意 ★环境:matla…

建模simulink - xpc自定义模块库

概述 打开simulink Library Browser,可以看到,simulink官方只为我们提供一些基本模型库,而在实际开发过程中,这些模型库往往需要我们进行二次封装后才能在项目中使用。这时,我们可以创建专属自己的自定义库,把项目中写好的一些模型块放在库中进行统一管理。这样当遇到类似…

在 macOS 中如何使用 XPC 实现跨进程通讯?

以防丢失&#xff0c;转载自&#xff1a; http://davidleee.com/2020/07/20/ipc-for-macOS/ 如侵权&#xff0c;联系删除 最近需要在 Electron 项目上引入一个比较吃性能的大头功能&#xff0c;因为已经用 Objective-C 实现过一套稳定且性能也可接受的带 UI 方案了&#xff0c;…

matlab xpc 环境pci板卡驱动编写,XPC环境下PCI板卡驱动

当Simulink 与S-function 相互作用时&#xff0c;Simulink 所调用的第一个程序是mdlInitializeSizes&#xff0c;随后调用的是其它S-function 函数(所有的函数名均以mdl 开头)。 在仿真结束时&#xff0c;Simulink 调用mdlTerminate函数。 2.3.2预处理 该范例以以下的定义开头&…

进程间通信之XPC

From&#xff1a;https://blog.csdn.net/heikefangxian23/article/details/51071840 关于 XPC XPC 是 OS X 下的一种 IPC (进程间通信) 技术, 它实现了权限隔离, 使得 App Sandbox 更加完备. 首先&#xff0c;XPC 更多关注的是实现功能某种的方式&#xff0c;通常采用其他方…

MacOS XPC的使用入门

MacOS&#xff1a;10.14&#xff0c;Xcode&#xff1a;11.0 1、随意创建一个工程&#xff0c;可以是App project Xcode -> File -> New -> Project... -> macOS -> Application -> App -> click Next 填写Product Name(XPCDemo) -> 选择或者不选择Team…

关于 XPC

关于 XPC XPC 是 OS X 下的一种 IPC (进程间通信) 技术, 它实现了权限隔离, 使得 App Sandbox 更加完备. 首先&#xff0c;XPC 更多关注的是实现功能某种的方式&#xff0c;通常采用其他方式同样能够实现。并没有强调如果不使用 XPC&#xff0c;无法实现某些功能。 XPC 目的是提…