写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
数据范围:保证结果在 1≤n≤231−1 1≤n≤231−1
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
示例1
输入:
0xAA
输出:
170
思路1:
这道题是16进制转10进制,字符串开始的0x是16进制的标识符,所以我们要先把它去掉,这里可以用subString;
后面的就是我们想要的16进制数据,现在要把这个String 转成 int,是不是很熟悉,Integer 的parseInt是可以指定进制的,所以这里我们用这个方法转一下就好了
解答1:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) {
String str = in.nextLine().substring(2);
System.out.print(Integer.parseInt(str,16) + "/n");
}
}
}
思路2:
有些小伙伴可能对这些不是很熟悉,所以下面的解法使用最基础的方式.
最开始的步骤还是一样的,先把0x去掉,仍然使用subString,比如0xC1变成C1
接下来要开始转换了,首先,1是倒数第一位的,它代表的数字是1*16的0次方,C是倒数第二位,代表12*16的1次方.
但是1的索引是1,但是16的幂是0,C的索引是0,16的幂是1,索引和幂之间的关系可以用这个关系来表示: 最大索引-当前索引 = 当前幂.
但如果我们把字符串反转一下,C1变成1C,这样索引和幂的关系就变成了 当前索引=当前幂.
之后我们从第一位开始,逐步计算即可.
解答2:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) {
int num = 0;
StringBuilder builder = new StringBuilder(in.nextLine().substring(2)).reverse();
for (int i = 0; i < builder.length(); i++) {
// 这里计算一下当前位置需要乘16的几次方
int y = 1;
for (int x = 0; x < i; x++) {
y = y * 16;
}
switch (builder.charAt(i)) {
case 'A':
num += (10 * y);
break;
case 'B':
num += (11 * y);
break;
case 'C':
num += (12 * y);
break;
case 'D':
num += (13 * y);
break;
case 'E':
num += (14 * y);
break;
case 'F':
num += (15 * y);
break;
default:
num += (Integer.valueOf(builder.charAt(i)+"") * y);
break;
}
}
System.out.println(num + "\n");
}
}
}