问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
/*
需求:从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
思路:将十六进制字符串按位加权展开,再各位相加。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
String strHex=sc.next();
toDec(strHex);
}
public static void toDec(String strHex)
{
long reu=0; //记录结果
int temp=0; //记录每一数位上的值
char []strArr=strHex.toCharArray();
for(int i=0;i<strHex.length();i++)
{
//各个位上的数字字符减去48的结果如果在0-9之间(含0-9)
// 则说明他们原本是0-9这九个字符之一,否则则通过一个
//switch语句判断他们是ABCDEF中的一个并取其值
if(strArr[i]-48<=9&&strArr[i]-48>=0)
temp=strArr[i]-48;
else
{
switch (strArr[i])
{
case 'A': temp=10;break;
case 'B': temp=11;break;
case 'C': temp=12;break;
case 'D': temp=13;break;
case 'E': temp=14;break;
case 'F': temp=15;break;
}
}
reu+=temp*Math.pow(16,strArr.length-i-1); //按位相加
}
System.out.println(reu);
}
}
我做该题的思路和代码注释中相同,这里就说一下做题过程中遇到的问题吧:
1.程序中定义的用来记录结果的变量reu的数据类型应定义为long,因为int类型的范围不足以满足题目。
2.在做题的过程中,一开始我没有定义用来暂存各位上的值的变量temp,以至于出现以下代码:
if(strArr[i]-48<=9&&strArr[i]-48>=0)
reu+=strArr[i]-48*Math.pow(16,strArr.length-i-1);
该错误代码没有考虑到运算式中的运算顺序的问题,会导致48先和后面的式子相乘,与结果不符。