藍橋杯 基礎練習 十六進制轉八進制

//下面的代碼實現部分全部放在了main函數中,看起來有些不清晰

package jinzhizhuanhuan2;
/*
 * 
 * 測試成功。
 * 經驗:當修改了代碼中的某個變量的名字是,特別注意:所有涉及到該變量的地方都要修改
 * 遺漏任何一處,可能運行出錯!!!
 */
import java.util.Scanner;
public class HextoOcalPrac {
	private static String[]hexnum={
			"0000","0001","0010","0011",
			"0100","0101","0110","0111",
			"1000","1001","1010","1011",
			"1100","1101","1110","1111"
	};
	private static String[]ocanum={
			"000","001","010","011",
			"100","101","110","111"
	};
	public static void main(String[]args){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int n=sc.nextInt();
			while(n-->0){
				String hex=sc.next();//查找並掃描下一個完整記錄
				StringBuilder sb=new StringBuilder();
				int t=0;
				//循環掃描hex字符串的每一個字符
				//if else 語句表示掃描的字符要麼爲數字。要麼爲字母
				while(t<hex.length()){
					if('0'<=hex.charAt(t)&&hex.charAt(t)<='9')
						sb.append(hexnum[hex.charAt(t++)-'0']);
					else
						sb.append(hexnum[hex.charAt(t++)-'A'+10]);
				}//退出while後sb爲對應的二進制字符串,接下來要3個字符爲一組的處理改字符串
				if(sb.length()%3==1)sb.insert(0,"00");//要保證sb的長度爲3的倍數
				if(sb.length()%3==2)sb.insert(0, "0");
				String bina=sb.toString();
			sb=new StringBuilder();//二進制的字符串一杯bina變量保留,所以要再次創建新的用來保存八進制
				//開始將二進制的字符串變爲8進制
				for(int i=0;i<=bina.length()-3;i+=3){
					String tem=bina.substring(i, i+3);
					for(int j=0;j<ocanum.length;j++){
						if(ocanum[j].equals(tem)){
							sb.append(i);//數組的下標就是對應的八進制數
							break;//找到對應的八進制數後,及時退出循環,節省運行時間
						}
					}
				}
				//接下來在輸出之前需要清除八進制開頭的0
				int p=0;
				//注意加上p<sb.length()防止越界!!
				while(p<sb.length()&&sb.charAt(p)=='0')p++;
				sb.delete(0, p);//這裏要特別注意delete方法的使用!!!
				System.out.println(sb);
			}
		}
	}
}

//下面的代碼把實現的部分封裝在了兩個方法中,看起來思路清晰了些

package jinzhizhuanhuan2;
import java.util.Scanner;
public class HextoOcal2Succeed {
 public static String toBina(String hex){
  String[]bina={
    "0000","0001","0010","0011",
    "0100","0101","0110","0111",
    "1000","1001","1010","1011",
    "1100","1101","1110","1111"
    };
  StringBuilder sb=new StringBuilder();
  int t=0;
  while(t<hex.length()){
   if('0'<=hex.charAt(t)&&hex.charAt(t)<='9')
    sb.append(bina[hex.charAt(t++)-'0']);
   else sb.append(bina[hex.charAt(t++)-'A'+10]);
  }
  //不要忘了,保證sb的長度必須爲3的倍數
  if(sb.length()%3==1)sb.insert(0,"00");
  if(sb.length()%3==2)sb.insert(0,"0");
  String tem=sb.toString();
  return tem;
 }
 public static String toOcal(String bina){
  String[]ocal={//第一遍,不仔細,寫漏了一個"010",程序結果錯誤!!!
    "000","001","010","011",
    "100","101","110","111"
  };
  StringBuilder sb=new StringBuilder();
  for(int i=0;i<=bina.length()-3;i+=3){
   String tem=bina.substring(i,i+3);
   for(int j=0;j<ocal.length;j++){
    if(tem.equals(ocal[j])){
     sb.append(j);
     break;
    }
   }
  }
  int p=0;
  while(sb.charAt(p)=='0')p++;
  sb.delete(0, p);//去除所有開頭的0
  return sb.toString();
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner sc=new Scanner(System.in);
  //System.out.println(toOcal("000011110"));//測試
  while(sc.hasNext()){
   int n=sc.nextInt();
   while(n-->0){
    String hex=sc.next();//不能用nextLine()方法!!!
    //System.out.println(toBina(hex));//測試
    System.out.println(toOcal(toBina(hex)));//測試    
   }
  }
 }
}
//當然也可以把實現方法封裝在類中,用面向對象的思想編程

測試結果測試結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章