蓝桥杯 基础练习 十六进制转八进制 Java实现

it2023-07-28  66

基础练习 特殊回文数

试题

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

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

输入格式

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

输出格式

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

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

样例输入

2   39   123ABC

样例输出

71   4435274

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

笔者碎碎念

笔者第一次看到提示,并没有深入去思考,而是按照老思路准备将十六进制数先转换成十进制数,再将十进制数转换成八进制。整个过程可谓是行云流水,写完后甚至觉得题目有点太过简单了,结果显而易见,笔者爆零了…于是我又重新审视了这个提示,恍然大悟,原来出题人已经提示至此。

实现思路

由图片我们不难发现,1位16(24)进制数可以变成1位2进制数,同理3位2进制数也可以变成1位8(23)进制数。因此可以考虑先将该16进制数(字符串格式)转换成2进制数,再去掉该2进制数的前导零,再判断其长度是否为3的倍数,若不为,则在高位补零保证长度为3的倍数。

完整代码

import java.util.Scanner; public class Main { public static void main(String[] args) { Question1(); } public static void Question1() { Scanner in = new Scanner(System.in); int n = Integer.parseInt(in.nextLine()); int i, j; String[] sz = new String[n]; //读入十六进制数 for (i = 0; i < n; i++) { sz[i] = in.next(); } for(i = 0; i < sz.length; i++) { String s = sz[i]; StringBuilder sb = new StringBuilder(); //将一位十六进制数转换为四位二进制数 for(j = 0; j < s.length(); j++) { switch(s.charAt(j)) { case '0': sb.append("0000"); break; case '1': sb.append("0001"); break; case '2': sb.append("0010"); break; case '3': sb.append("0011"); break; case '4': sb.append("0100"); break; case '5': sb.append("0101"); break; case '6': sb.append("0110"); break; case '7': sb.append("0111"); break; case '8': sb.append("1000"); break; case '9': sb.append("1001"); break; case 'A': sb.append("1010"); break; case 'B': sb.append("1011"); break; case 'C': sb.append("1100"); break; case 'D': sb.append("1101"); break; case 'E': sb.append("1110"); break; case 'F': sb.append("1111"); break; } } //再将二进制数转换成八进制数 transform(sb); } } public static void transform(StringBuilder sb) { int num = sb.length() % 3; //判断长度是否为3的倍数 switch(num) { case 0: //若转换的八进制数中第一位为0则删去 if(sb.substring(0, 3).equals("000")) sb.delete(0, 3); break; case 1: if(sb.substring(0, 1).equals("0")) sb.delete(0, 1); else sb = sb.insert(0, "00"); break; case 2: if(sb.substring(0, 2).equals("00")) sb.delete(0, 2); else sb = sb.insert(0, "0"); break; } StringBuilder res = new StringBuilder(); int len = sb.length(); String[] new_s1 = new String[len/3]; //取三位转换成八进制数 for(int i = 0; i < len/3; i++) { int tmp = Integer.parseInt(sb.substring(i * 3, i * 3 + 3), 2); res.append(tmp); } System.out.println(res); } }

准备蓝桥杯时C/C++转Java初学者,算法略繁琐,欢迎评论指出不足! 同时也欢迎评论中提出问题!

最新回复(0)