问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
首先,先讲一下公式(该公式适合运用于任何进制转十进制):
系数:所给数字每一位上的数据;基数:所给的数字为X进制,基数就位X
权:在数字的右边从0开始编号,每一位上对应的编号即为权
结果 = 系数 * 基数的权次幂相加
例:0x235 = 2 * 16 ^ 2 + 3 * 16 ^ 1 + 5 * 16 ^ 0 = 565
0100 = 1 * 8 ^ 2 + 0 * 8 ^ 1 + 0 * 8 ^ 0 = 64
然后,看代码:
import java.util.Scanner;
public class Main {
public Main() {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
int length = str.length(); //获取输入字符串的长度
int[] a = new int[length]; //定义一个数组,用于存放每一位的数字即存放系数
for (int i = 0; i < length; i++) { //利用for循环为数组赋值
switch (str.charAt(i)) {
case 'a':
case 'A':
a[i] = 10;
break;
case 'b':
case 'B':
a[i] = 11;
break;
case 'c':
case 'C':
a[i] = 12;
break;
case 'd':
case 'D':
a[i] = 13;
break;
case 'e':
case 'E':
a[i] = 14;
break;
case 'f':
case 'F':
a[i] = 15;
break;
default:
a[i] = Integer.parseInt(str.charAt(i)+""); //将char转换为int
break;
}
}
long result = 0;
int n = 0; //定义一个变量作为权
for (int i = length-1; i >= 0; i--) {
result += a[i]*Math.pow(16,n); //利用公式计算
n++;
}
System.out.println(result);
}
public static void main(String[] args) {
new Main();
}
}