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

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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值