天天看点

蓝桥杯——十六进制转十进制

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。

  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

样例输入

FFFF

样例输出

65535

思路:首先Java虽然有自带的转换方法,但是当输入的十六进制太大的时候,输出类型的int就不足以存下,会爆掉。所以要通过double类型进行运算。

首先,把十六进制从低位遍历,按照第一位是16 ^0,第二位16 ^1这样,再相加,最后可以得到double类型的结果,然后还要把double转成字符串形式。

参考代码

import java.util.Scanner;

public class toDecimal {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		Double output = 0.0;//最终输出结果的科学计数法(Math.pow返回的是double类型,并且用Double因为后面需要用到相关的方法)
		for (int i = s.length()-1; i >=0;i--) {//从低位开始循环遍历s
			switch(s.charAt(i)) {
			case '0':break;
			case '1':output+=1*Math.pow(16, s.length()-1-i);break;//这里要注意次方是多少
			case '2':output+=2*Math.pow(16, s.length()-1-i);break;
			case '3':output+=3*Math.pow(16, s.length()-1-i);break;
			case '4':output+=4*Math.pow(16, s.length()-1-i);break;
			case '5':output+=5*Math.pow(16, s.length()-1-i);break;
			case '6':output+=6*Math.pow(16, s.length()-1-i);break;
			case '7':output+=7*Math.pow(16, s.length()-1-i);break;
			case '8':output+=8*Math.pow(16, s.length()-1-i);break;
			case '9':output+=9*Math.pow(16, s.length()-1-i);break;
			case 'A':output+=10*Math.pow(16, s.length()-1-i);break;
			case 'B':output+=11*Math.pow(16, s.length()-1-i);break;
			case 'C':output+=12*Math.pow(16, s.length()-1-i);break;
			case 'D':output+=13*Math.pow(16, s.length()-1-i);break;
			case 'E':output+=14*Math.pow(16, s.length()-1-i);break;
			case 'F':output+=15*Math.pow(16, s.length()-1-i);break;
			}
		}	
		//下面是完成将科学计数法的结果转换成int类型的字符串形式
		StringBuffer sb = new StringBuffer(output.toString());
		//主要思想就是:分两种情况,一种是带E的,一种是不带E的,下面注释掉的代码分别运行并输入FFFF与FFFFFFFF可以帮助理解
//		System.out.println(sb);
		if(sb.charAt(sb.length()-2)=='.') {//.0结尾的形式:直接去掉最后两位的“.0”输出就好
			sb.replace(sb.length()-2, sb.length(), "");
			System.out.println(sb);
		}else{//E结尾的形式,要先记录最后一位数X是多少,然后去掉后面二位的 “EX”和前面第二位的“.”,并且判断是否需要加0
			//len是记录最后一位数X是多少
			int len = Integer.parseInt(String.valueOf(sb.charAt(sb.length()-1)));
			//去掉后面二位的 “EX”和前面第二位的“.”
			sb.replace(sb.length()-2, sb.length(), "");
			sb.replace(1, 2, "");
			//判断是否需要加0
			while(sb.length()<len+1) {
				sb.append("0");
			}
			//输出
			System.out.println(sb);
		}
	}
}
           
蓝桥杯——十六进制转十进制