#做题笔记,仅自己看的懂
题目:
正确姿势一:通过Java已经提供的方法实现 ( 该方法由亲爱的网友给出 ,非常的正确高效, 感谢 )
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println(Long.parseLong(new Scanner(System.in).nextLine(), 16));
}
}
正确姿势二:(通过遍历16进制数各位置对应的十进制值相加得到总值,因数据可能会非常大故采用超大型数据类型bigInteger存储)
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
HashMap<Character, Integer> hashmap = new HashMap<Character, Integer>();
hashmap.put('F', 15);
hashmap.put('E', 14);
hashmap.put('D', 13);
hashmap.put('C', 12);
hashmap.put('B', 11);
hashmap.put('A', 10);
int numtmp = 0;
BigInteger value = new BigInteger("0");// 由于8位FFFFFFFF的值已经超过int的最大范围,使用int必然出错
// 于是选用超大型数据类型
BigInteger valuetmp = new BigInteger("0");// valuetmp用于存储中间值
String bs1 = "";
for (int j = str.length() - 1; j >= 0; j--) {
if (str.charAt(j) <= '9') {
valuetmp = BigInteger.valueOf(Integer.parseInt(str.charAt(j) + ""))
.multiply(BigInteger.valueOf((int) Math.pow(16, numtmp)));
} else {
valuetmp = BigInteger.valueOf(hashmap.get(str.charAt(j)))
.multiply(BigInteger.valueOf((int) Math.pow(16, numtmp)));
//....BigInteger.valueOf((int) Math.pow(16, numtmp))这里可以用int,
//即使是算到最后一个F的值,它也在int范围内,只要用int或比int大的类型都行
}
value = value.add(valuetmp);
numtmp++;
}
System.out.println(value);
}
}
正确姿势三:(先通过十六进制转换为二进制,在通过计算转化成十进制值)
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
String bs1 = "";
StringBuilder stringBuilder;// 二进制字符串
stringBuilder = new StringBuilder();
for(int j=0;j<str.length();j++) {
bs1 = Integer.toBinaryString(Integer.valueOf(str.charAt(j)+"", 16));
//借助了java自带的短字符串16进制转二进制,只能转短的,太长不行,所以这里一个一个十六进制转 // System.out.println(bs1);
while(bs1.length()<4&&j!=0) { bs1="0"+bs1; }
//要保证一个十六进制输出为4位二进制,但如果字符串只有一位十六进制的话,最前面是不能有0的,如果j为0这里就不进入循环
stringBuilder.append(bs1); //拼接成长长的二进制字符串
}
int numtmp = 0;
BigInteger value = new BigInteger("0");// 由于8位FFFFFFFF的值已经超过int的最大范围,使用int必然出错
// 于是选用超大型数据类型
long valuetmp;// valuetmp用于存储中间值
for (int En = stringBuilder.length() - 1; En >= 0; En--) {
valuetmp = Integer.parseInt(stringBuilder.charAt(En) + "") * (long) Math.pow(2, numtmp);
// ....(long)Math.pow(2, numtmp)这里要用大于int 范围的类型 因为在八位都是F的时候
// 最后一次计算值很大,如果强转为int将会有轻微失真,会比强转为long时的值小1,这里就是题目最后一个测试用例,
//如果没有选取合适,最后一个测试用例将过不了,会感觉很奇怪,选取long或超大型数据类型bigIntegr都可得到最后答案
value = value.add(BigInteger.valueOf(valuetmp));
numtmp++;
}
System.out.println(value);
}
}