写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
数据范围:保证结果在Int所允许的数据范围内
注意本题有多组输入
输入描述:
输入一个十六进制的数值字符串。注意:一个用例会同时有多组输入数据。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
输入例子1:
0xA 0xAA
输出例子1:
10 170
解题思路:
比较基础的数学题,谈不上什么特别的思路。可以用Java自带的parseInt功能进行解题,代码数量比较少。牛客上看到也可以用java自带的decode来进行转换。
这里还是尊重一下算法题的初衷,从算法的角度解决问题。
一上手的第一反应是从右往左遍历当前字符串,直到遇到x时终止。
如何处理A到F的数值,这里主要用了HashMap来保存映射
import java.util.*;
public class Main{
public static void main(String[] args){
//这里用HashMap保存字母和值之间的映射
Map<Character, Integer> map = new HashMap<>();
map.put('A',10);
map.put('B',11);
map.put('C',12);
map.put('D',13);
map.put('E',14);
map.put('F',15);
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String s = sc.next();
int sum = 0;
//反向遍历当前字符串
for(int i = 0; i <s.length(); i++){
char currChar = s.charAt(s.length()-i-1);
//x不存在于16进制数字的主体中,所以遇到
if(currChar == 'x')break;
int currNum = 0;
//计算当前位的值
double base = Math.pow(16, i);
if(map.containsKey(currChar)){
currNum = map.get(currChar);
}else{
currNum = currChar - 48;
}
currNum *= base;
sum += currNum;
}
System.out.println(sum);
}
}
}