蓝桥杯试题集-基础练习题-十六进制转十进制(Java)

#做题笔记,仅自己看的懂
题目:

在这里插入图片描述
正确姿势一:通过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);

	}

}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值