天天看點

十六進制轉十進制 藍橋杯

問題描述

  從鍵盤輸入一個不超過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;
	}
}