問題描述
從鍵盤輸入一個不超過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; //記錄結果
long 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的長度不足以滿足題目“不超過8位的正的十六進制數字符串”。
2.在一開始的代碼中我沒有定義用來存放各位上的值的變量temp,而是直接在if和switch判斷式中進行展開運算,造成了如下代碼:
if(strArr[i]-48<=9&&strArr[i]-48>=0)
reu+=strArr[i]-48*Math.pow(16,strArr.lenth-i-1);
這裏沒有考慮到運算式中的運算順序,這樣的寫法會造成48先與後面的式子相乘,與結果不符,在調試時很難檢查到。