蓝桥杯 基础试题 十六进制转八进制
题目描述:
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。接下来n行,每行一个由0到9,A到F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
测试用例
样例输入
2
39
123ABC
样例输出
71
4435274
测试用例分析
类别 | 十六进制 | 二进制 | 八进制 | |
---|---|---|---|---|
输入用例1 | 39 | 39 | 00100111 | 071 |
输入用例2 | ADE | ADE | 1010 1101 1110 | 5336 |
输入用例3 | 123ABC | 123ABC | 1 0010 0011 1010 1011 1100 | 4435274 |
...... | ...... | ...... | ...... | ...... |
提示
使用字符串,进制转换,循环来解决这一道题。
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
做题思想
第一步:使用方法来编写相关的类,比如说,十六进制的字符串转换为二进制的字符串函数,将临界的情况可以充分的考虑;
第二步:在主函数main中编写输出代码,主要编写如何将键盘输入的字符串十六进制转换为八进制并且将它打印在控制台;在主函数中我们主要使用到
Integer.toBinaryString(Integer.valueOf(“字符串的十六进制”,16)),该方法是将键盘输入的十六进制字符串转换为十六进制;
第三步:我们必须学会使用字符串的截取,拼接方法的调用;如拼接的方法append(String string)
字符串的截取:substring(int i)
第四步:考虑题目中的前导零必须去掉,以及字符串的长度是不是为3的倍数和4的倍数,例如,字符串的长度对3求余,余数为1,则向字符串中添加两个零,若余数为2,则向字符串添加一个零。
代码实现
第一种解法:使用Integer类,调用Integer.parseInt(字符串,需要转的目标进制),再用Integer.toString(十进制数,目标进制),代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
while(n < 1 && n > 10){
break;
}
for(int i = 0; i < n; i++){
String a = input.next();
int b = Integer.parseInt(a,16);
String result = Integer.toString(b,8);
System.out.println(result);
}
}
}
该方法对于蓝桥杯系统给出的实例有很大的差别,所以不建议采用!看看第二种解法:
第二种解法:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int n = input.nextInt();
while(n < 1 && n > 10){}
for(int i = 0; i < n; i++){
//获取每一行数据
String line = input.next();
//创建一个存储数据的容器
StringBuilder sb = new StringBuilder();
for(int j = 0; j < line.length(); j++){
//将每一个字符进行拼接,转成二进制
sb.append(hexToBin(line.substring(j,j+1)));
}
String bin = formatAddZero(sb.toString());
//重新为sb 赋值
sb = new StringBuilder();
//将二进制转换成八进制
for(int j = 0; j < bin.length(); j+=3){
sb.append(binToOctal(bin.substring(j, j+3)));
}
String result = sb.toString();
//取出前导零
for(int j = 0; j < result.length(); j++){
if(result.charAt(j) != '0'){
result = result.substring(j);
break;
}
}
System.out.println(result);
}
}
//将含有十六进制的字符串转换为二进制
public static String hexToBin(String hex){
return formatBinAddZero(Integer.toBinaryString(Integer.valueOf(hex, 16)));
}
//将含有二进制的字符串转换为八进制
public static String binToOctal(String bin){
return Integer.toOctalString(Integer.valueOf(bin, 2));
}
//由于二进制转八进制,是三位二进制算一位八进制,顾添零操作
public static String formatAddZero(String string){
if(string.length() % 3 == 1){
string = "00" + string;
}
if(string.length() % 3 == 2){
string = "0" + string;
}
return string;
}
//将二进制的添加零情况
public static String formatBinAddZero(String string){
if(string.length() % 4 == 1){
string = "000" + string;
}
if(string.length() % 4 == 2){
string = "00" + string;
}
if(string.length() % 4 == 3){
string = "0" + string;
}
return string;
}
}
参考资料
一,《数学之美》吴军编著,该书主要叙述了,从事IT行业的学者,学生,从事科学研究,博士等等,主要告诉我们最重要的就是掌握思维的方法,学计算机,我们必要的知识就是数学,“数学告诉我们:简单性和模块化是软件工程的基石;分布性和容错性是互联网的生命!”。我们从中应该要学到:“我们不仅要拥有欣赏美的眼睛,还要去创造美的境界!”。
《Java基础入门》黑马程序员/编著
《数据结构与算法分析 java语言描述》(美)马克·艾伦·维斯(Mark Allen Weiss) 著; 冯舜玺,陈越 译 著
值得学习的知识
Java语言版的数据结构以及算法分析
基本的Java语言,比如进制转换,循环,基本方法的使用
学习的建议
熟悉使用java的一些基本的编程思想