//下面的代碼實現部分全部放在了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)));//測試
}
}
}
}
//當然也可以把實現方法封裝在類中,用面向對象的思想編程
測試結果