藍橋杯演算法題:十六進位制轉8進位制
阿新 • • 發佈:2018-12-17
問題描述 給定n個十六進位制正整數,輸出它們對應的八進位制數。
輸入格式 輸入的第一行為一個正整數n (1<=n<=10)。 接下來n行,每行一個由09、大寫字母AF組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。
輸出格式 輸出n行,每行為輸入對應的八進位制正整數。
【注意】 輸入的十六進位制數不會有前導0,比如012A。 輸出的八進位制數也不能有前導0。
樣例輸入 2 39 123ABC
樣例輸出 71 4435274
【提示】 先將十六進位制數轉換成某進位制數,再由某進位制數轉換成八進位制。
解法
import java.util.Scanner; public class Trans { public static void main(String[] args){ Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); String[] array=new String[n]; //16進位制轉換二進位制 StringBuffer[] result=new StringBuffer[n]; for(int u=0;u<n;u++){ array[u]=scanner.next(); int length=array[u].length(); int i=length; StringBuffer sb=new StringBuffer(); while(i!=0){ switch (array[u].charAt(length-i)){ case '0': sb.append("0000"); break; case '1': sb.append("0001"); break; case '2': sb.append("0010"); break; case '3': sb.append("0011"); break; case '4': sb.append("0100"); break; case '5': sb.append("0101"); break; case '6': sb.append("0110"); break; case '7': sb.append("0111"); break; case '8': sb.append("1000"); break; case '9': sb.append("1001"); break; case 'A': sb.append("1010"); break; case'B': sb.append("1011"); break; case 'C': sb.append("1100"); break; case 'D': sb.append("1101"); break; case 'E': sb.append("1110"); break; case 'F': sb.append("1111"); break; } --i; } result[u]=sb; } //二進位制轉八進位制 for(int k=0;k<n;k++){ String b=result[k].toString(); if(result[k].length()%3==1){ b="00"+result[k]; } else if(result[k].length()%3==2){ b="0"+result[k]; } //讓輸出結果的開頭不會為零 int length=b.length(); //因為'0'的acci碼是48,而不是從0開始,所以要char與整形進行運算要得到正確結果都要-‘0’,保證結果正確; int a=(b.charAt(0)-'0')*4+(b.charAt(1)-'0')*2+(b.charAt(2)-'0'); if(a!=0) System.out.print(a); for(int e=3;e<length;e++){ int s=(b.charAt(e)-'0')*4+(b.charAt(e+1)-'0')*2+(b.charAt(e+2)-'0'); e+=2; System.out.print(s); } System.out.println(); } } }
注意
類名必須是Main,以上程式碼並沒有改,而且這題做的話最好用StringBuffer或StringBuilder來操作字串,不然單純用String效率會很低,提交到系統的話可能會操作超時