問題描述
從鍵盤輸入一個不超過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先和後面的式子相乘,與結果不符。