试题 基础练习 十进制转十六进制
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
格式说明
输入格式:
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式:
输出这个整数的16进制表示
测试用例
样例输入:
30
样例输出:
1E
测试用例分析
输入字符串代表的十进制 | 二进制 | 十六进制 | |
测试用例1 | 0 | 0000 | 0 |
测试用例2 | 30 | 00011110 | 1E |
测试用例3 | 456 | 1 1100 1000 | 1C8 |
测试用例4 | 78945 | 1 0011 0100 0110 0001 | 1 3461 |
...... | ...... | ...... | ...... |
做题思想
在这里我主要使用了以下方法:
第一:使用了Long这个类,为了防止溢出。
第二:使用了 String toUpperCase(Locale locale) 将所有在此字符 String使用给定的规则,大写输出的字符。
第三: static long parseLong(String s, int radix)
将字符串参数解析为由第二个参数指定的基数中的带符号的 long 。第四:static String toBinaryString(long i) 返回 long参数的字符串表示形式为基数2中的无符号整数。
第五:static Long valueOf(String s, int radix) 返回一个
Long对象,该对象保存从指定的String String的值,并用第二个参数给出的基数进行解析。上面的知识都是借助Java API 得以完成,建议大家学习的时候,可以查阅Java的API,下面是我使用的API,希望对你有帮助。
程序如下
第一种程序,在蓝桥杯系统上,只给了45分,顾还不完善,还需要继续思考
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
String line = input.next();
//System.out.println(tenToBinary(binToHex(line)));
System.out.println(tenToBinary(line));
System.out.println(binToHex(tenToBinary(line)));
}
//将十进制转换为二进制
public static String tenToBinary(String string){
return formatBinAddZero(Long.toBinaryString(Long.parseLong(string, 10)));
}
//将二进制转换为十六进制
public static String binToHex(String bin){
return Long.toHexString(Long.valueOf(bin, 2));
}
//将二进制的添加零情况
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;
}
}
经过我的分析,原因是控制台输出的默认的是小写字母,所以会报错,顾只能得到45分。
错误的程序分析
在上面的代码中,我少添加了将控制台输出的小写字母转换为大写的方法,所以出错。
更重要的一点是:代码不够简洁,鲁棒性差,代码比较冗余,不建议使用,可以参考。
修改后的(正确的)代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
String line = input.next();
//观察,输入的十进制字符串能否正确的转换为二进制
//System.out.println(tenToBinary(line));
System.out.println(binToHex(tenToBinary(line)).toUpperCase());
}
//将十进制转换为二进制
public static String tenToBinary(String string){
return formatBinAddZero(Long.toBinaryString(Long.parseLong(string, 10)));
}
//将二进制转换为十六进制
public static String binToHex(String bin){
return Long.toHexString(Long.valueOf(bin, 2));
}
}
在这个代码里面,相比上面的代码,我只添加了一个将小写字母转换为大写字母的方法**toUpperCase()**的方法。
启示
多做多练,多查阅,学习数据结构与算法,能够将代码写得很好,完美。
还需要基本了解一些基本类的用法。比如Integer和Long的区别
一定要学会各进制之间的转换