资源限制
时间限制: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);
}
}
}