蓝桥杯练习系统之基础训练Java版(2-11)—— 十六进制转十进制
**难度等级:普通**
**关键字:进制转换 字符处理 判断**
问题描述:
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入:
FFFF
样例输出:
65535
思路探索:
1、当输入为FFFFFFF时,输出268435455,显然超过了int类型(-2147483648到2147483647)的范围,所以我们将n声明成long类型。
这道题用java来做的话,不推荐暴力破解法。代码太多,且容易打错。
2、可以利用Long类中的parseLong(String s, int radix)方法来做这道题,
功能是:将 string 参数解析为有符号的 long,基数由第二个参数指定。
3、也可以用Long类中的valueOf(String s, int radix)来做
功能:当使用第二个参数给出的基数进行解析时,返回保持从指定 String 中提取的值的 Long 对象。
第一种:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String n = sc.nextLine();
long a = Long.parseLong(n, 16);
System.out.print(a);
}
}
第二种:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String n = sc.nextLine();
long a = Long.valueOf(n, 16);
System.out.print(a);
}
}
暴力破解法:(结果正确的哈,但是评测只有25分)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String n = sc.nextLine();
char[] c = n.toCharArray(); //将字符串对象中的字符转换为一个字符数组
System.out.print(c);
long sum = 0;
int len = c.length -1;
for (int i = 0; i < len; i++) {
if((int)c[i] - 48 > 9){
if(c[i] == 'A')
sum += 10 * Math.pow(16, len-i);
else if(c[i] == 'B')
sum += 11 * Math.pow(16, len-i);
else if(c[i] == 'C')
sum += 12 * Math.pow(16, len-i);
else if(c[i] == 'D')
sum += 13 * Math.pow(16, len-i);
else if(c[i] == 'E')
sum += 14 * Math.pow(16, len-i);
else if(c[i] == 'F')
sum += 15 * Math.pow(16, len-i);
} else {
sum += ( (int)c[i] - 48) * Math.pow(16, len-i);
}
}
System.out.println(sum);
}
}
希望能对您有帮助!谢谢。