1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【无标题】蓝桥杯java 给定n个十六进制正整数 输出它们对应的八进制数

【无标题】蓝桥杯java 给定n个十六进制正整数 输出它们对应的八进制数

时间:2021-05-22 19:03:07

相关推荐

【无标题】蓝桥杯java 给定n个十六进制正整数 输出它们对应的八进制数

做这道题时,编译器上没问题,放到蓝桥杯上就出问题了,后来网上搜了下,才知道看错题了,输入数据长度不超过100000,不是大小。然后看到一位大佬用C语言写的,三位三位的转换。

C代码链接[/p/455497136]

然后下面是我自己用java实现的,有注释我自己的理解。

问题描述

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

输入格式

输入的第一行为一个正整数n (1<=n<=10)。

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

输出格式

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

【注意】

输入的十六进制数不会有前导0,比如012A。

输出的八进制数也不能有前导0。

样例输入

2

39

123ABC

样例输出

71

4435274

【提示】

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

package pra1220;import java.util.Scanner;/*** 资源限制* 时间限制:1.0s 内存限制:512.0MB* 问题描述* 给定n个十六进制正整数,输出它们对应的八进制数。** 输入格式* 输入的第一行为一个正整数n (1<=n<=10)。* 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。** 输出格式* 输出n行,每行为输入对应的八进制正整数。** 【注意】* 输入的十六进制数不会有前导0,比如012A。* 输出的八进制数也不能有前导0。** 样例输入* 2* 39* 123ABC** 样例输出* 71* 4435274** 【提示】* 先将十六进制数转换成某进制数,再由某进制数转换成八进制。*/public class Basic12{public static void main(String[] args) {/*** 解决思路,3个十六进制(12位二进制)对应4个八进制(12位二进制),把一个十六进制的数拆成一堆三位三位的数,然后三位三位的转换为八进制,最后拼起来就是最终结果* 首先对于给定的十六进制输入长度取余,如果不是3的整数倍,则在第一次进行分段转换时根据缺的位数在前面补零* n:需要输入的数据个数* b[3](char[]):暂存3个十六进制* first(boolean):对于每个十六进制数据,判断是否是最前面的三位(即第一次分段转换),然后根据需要进行补零* len:每一个十六进制数据的长度* temp_result(String):暂存一个十六进制数到八进制数转换过程的每次的小转换(3个16进制位换成4个八进制位)结果*/Scanner scanner = new Scanner(System.in);// 输入n个十十六进制数int n = scanner.nextInt();String[] input = new String[n];scanner.nextLine(); //消除回车键的影响for(int i=0;i<n;i++){input[i] = scanner.nextLine();}scanner.close();char[] b = new char[3];int len=0,d=0,k=0;Boolean first = true;String temp_result;for(int i=0;i<n;i++){len = input[i].length(); // 获取该十六进制数的长度k=0;d = len%3==0 ? 3 : len%3; //判断十六进制数长度是否为3的整数倍// System.out.println("d"+d);if(d==2){//不是整数倍,取余结果为2,该十六进制数前补1个0,凑3的整数被b[k++] = '0';}if(d==1){//同理,不是整数倍,取余结果为1,补两个0b[k++] = '0';b[k++] = '0';}first = true; //重新将first置为true/*** 将十六进制数转换为八进制数*/for(int j=0;j<len;j++){b[k++] = input[i].charAt(j); //取出该十六进制数的一位d--;//System.out.println(new String(b));if(d==0){//当d==0,即b满了,成功取了3位十六进制数,开始转换为4位八进制数d=3;k=0; //重新置零// 3位十六进制-->4位八进制temp_result = Integer.toOctalString(Integer.parseInt(String.valueOf(b),16));if(first){//如果是第一次(前三位十六进制)则不进行补零操作,first = false;}else{// 因为每次由转换得到的八进制结果可能不足4位(0x123--->0o0443,0443前面的零会被省略),如果不补零,那么合起来的结果就是错了if(temp_result.length()==3){temp_result = "0"+temp_result;}else if(temp_result.length()==2){temp_result = "00" + temp_result;}else if(temp_result.length()==1){temp_result = "000" +temp_result;}else if(temp_result.length() == 0){temp_result = "0000";}}System.out.print(temp_result); //直接输出转换后的4位八进制,但不换行,最后连起来就是一个16进制数转换的结果}}System.out.println();//完成一个16进制数的转换,才换行}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。