1、题目内容
[编程题]进制转换
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
输入例子:
0xA
输出例子:
10
2、题目解析
方法1:将十六进制的数值字符串转换成十进制字符串,用Integer类的
public static int parseInt(String s,int radix)
throws NumberFormatException
方法:使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
因为十六进制的数值字符串的前两个字符是0和X,所以要截取字符串前两个字符之后的子串再解析成整形。
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){//多个测试用例用while(sc.hasNext()){}
String s = sc.next().substring(2);
System.out.println(Integer.parseInt(s,16));
}
}
}
方法2:自己写转换方法
用一个字符串可变序列StringBuilder来接收输入的十六进制的数值字符串,因为十六进制的数值字符串的前两个字符是0和X,所以要截取字符串前两个字符之后的子串,用得到的子串转换成10进制。例如:0x12转换成10进制为1乘以16的1次方加上2乘以16的0次方(1*16^1+2*16^0;),观察16的幂正好是字符串中的字符倒序之后的下标,即字符值乘以16的字符下标次方。所以要反转字符串,再将字符串转化成字符数组,遍历字符数组在通过上述方法转换成10进制。
步骤
1、创建扫描器对象(Scanner sc = new Scanner(System.in))
2、为实现多用例测试;使用while(sc.hasNext()){}来判断是否还有输入。
3、在while循环里实现转换功能。
4、创建一个字符串可变序列StringBuilder对象;
5、将键盘录入的字符串值添加到字符串可变序列
6、将字符串可变序列对象反转并截取,得到一个新的字符串。
7、将新的字符串转化成字符数组
8、定义一个int型的变量,装载转换后的10进制值。
9、遍历字符数组,判断每个字符。因为十六进制的a(A)->10,b(B)->11,c(C)->12,d(D)->13,e(E)->14,f(F)->15.超出F就不是16进制数啦。
for(int i=0;i<ch.length;i++){
if(ch[i]>='A'&&ch[i]<='F'){
sum+=(ch[i]-55)*Math.pow(16, i);
}else if(ch[i]>='a'&&ch[i]<='f'){
sum+=(ch[i]-87)*Math.pow(16, i);
}else if(ch[i]>='0'&&ch[i]<='9'){
sum+=(ch[i]-48)*Math.pow(16, i);
}else{
System.out.println("输入的字符串不是十六进制形式!");
}
}
10、输出int型的变量就是转换后的10进制数啦。
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[]args){
/*Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String s = sc.next().substring(2);
System.out.println(Integer.parseInt(s,16));
}*/
Scanner sc = new Scanner(System.in);
//不用Integer类的方法转换,自己转换
while(sc.hasNext()){
StringBuilder sb = new StringBuilder();
sb.append(sc.next());
String s = sb.reverse().substring(0, sb.length()-2);
char[]ch = s.toCharArray()
int sum = 0;
for(int i=0;i<ch.length;i++){
if(ch[i]>='A'&&ch[i]<='F'){
sum+=(ch[i]-55)*Math.pow(16, i);
}else if(ch[i]>='a'&&ch[i]<='f'){
sum+=(ch[i]-87)*Math.pow(16, i);
}else if(ch[i]>='0'&&ch[i]<='9'){
sum+=(ch[i]-48)*Math.pow(16, i);
}else{
System.out.println("输入的字符串不是十六进制形式!");
}
}
System.out.println(sum);
}
}
}