做这道题时,编译器上没问题,放到蓝桥杯上就出问题了,后来网上搜了下,才知道看错题了,输入数据长度不超过100000,不是大小。然后看到一位大佬用C语言写的,三位三位的转换。
C代码链接[https://zhuanlan.zhihu.com/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,补两个0
b[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进制数的转换,才换行
}
}
}