题目链接:
描述:输入一个2进制的数,要求输出该2进制数的16进制表示。在16进制的表示中,A-F表示10-15
输入:第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000
输出:n行,每行输出对应一个输入。
对于一个值比较小的二进制数转化为十六进制的数可以在java中直接调用函数解决,代码如下:
解题代码一:
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>0){
int k=input.nextInt();
int tem=Integer.parseInt(String.valueOf(k), 2);
String str=Integer.toHexString(tem).toUpperCase();
System.out.println(str);
n--;
}
input.close();
}
}
但是,本题的输入二进制的位数很多,字符长度可达10000,超出了int型数的限制,于是,解题应更加复杂。
对于一个二进制的数每四位数可以转化为一个十六进制数,例如1111可转化为F; 0001转化为1 ;1000转化为8;11101010转化为EA。对于一个二进制的数位数若不是4的倍数,可以在前面补零,补成4的倍数位。例如:1111011111补为为001111011111转化为十六进制:3DF
解题代码二:
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>0){
String k=input.next();
System.out.println(turn2to16(k));
n--;
}
input.close();
}
private static String turn2to16(String str) {
String sum="";
int t=str.length()%4;
if(t!=0){
for(int i=str.length();i-4>=0;i=i-4){
String s=str.substring(i-4,i);
int tem=Integer.parseInt(String.valueOf(s), 2);
sum=Integer.toHexString(tem).toUpperCase()+sum;
}
String st=str.substring(0,t);
int tem=Integer.parseInt(String.valueOf(st), 2);
sum=Integer.toHexString(tem).toUpperCase()+sum;
}
else{
for(int i=str.length();i-4>=-1;i=i-4){
String s=str.substring(i-4,i);
int tem=Integer.parseInt(String.valueOf(s), 2);
sum=Integer.toHexString(tem).toUpperCase()+sum;
}
}
return sum;
}
}