問題描述
從鍵盤輸入一個不超過8位的正的十六進制數字元串,将它轉換為正的十進制數後輸出。
注:十六進制數中的10~15分别用大寫的英文字母A、B、C、D、E、F表示。
樣例輸入
FFFF
樣例輸出
65535
寫這道題是一個比較悲慘的故事,寫了1小時,debug2小時,關鍵永遠不認為自己錯了;
錯誤原因主要是變量名太相似了;
其次我突然弄混了一般的和Java中的“^”,我就不明白為什麼運算結果就是不對,我一開始很盲目,後來靜下心來,仔細看可能出錯的地方,把可能出錯的地方列印出來;
package 藍橋杯題庫;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
*将輸入的字元串變為字元數組;将字元數組變為二進制數組;二進制轉10進制
*/
public class oj{
public static void main(String[] args) throws IOException{
BufferedReader re=new BufferedReader(new InputStreamReader(System.in));
String s1="",s2="";//s1 存放16進制字元串,s2存放二進制字元串;
long sum;//存放結果
s1=re.readLine().toUpperCase();//讀入字元串,如果是小寫,自動轉化為大寫
s2=hexToBinary(s1);//16進制字元串轉化為2進制字元串
sum=binaryToDecimal(s2);//2進制傳回為10進制
System.out.println(sum);//列印結果
}
//16進制轉化為2進制
public static String hexToBinary(String s){
char[] ch={'0','1'};
String str=new String("0123456789ABCDEF");//每一個字元所在位置索引就是該數大小,比如a在第10的位置,則實際代表10進制10;
char[] ch1=s.toCharArray();//16進制的字元串轉化為16進制的字元數組
int pos=ch1.length*4;//涉及到進制轉化問題,可以看我另一篇文章,,簡單說,1位16進制可以被4位2進制代替
char[] ch2=new char[pos];//ch2用來儲存轉化的2進制數組
for(int i=ch1.length-1;i>=0;i--){
int temp=str.indexOf(ch1[i]);//indexOf函數作用即傳回某一字元在str的位置,即所代表的10進制數大小,indexOf從0開始
for(int j=0;j<4;j++){
ch2[--pos]=ch[temp&1];//&按位與,比如a是1010,則temp&1=0,即ch[--pos]位置是ch[0]=='0'
temp=temp>>>1;//位移操作符,比如1010,位移後為101,那麼temp&1=1;
}
}
return new String(ch2);//傳回2進制字元串
}
//二進制轉10進制
public static long binaryToDecimal(String s){
long sum=0;//儲存結果
for(int i=0;i<s.length();i++){
sum+=(s.charAt(s.length()-i-1)-'0')*(Math.pow(2,i));//‘0’和0 是有數值差別的,‘0’==int 48;
}
return sum;
}
}