問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。輸入格式
輸入的第一行爲一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。輸出格式
輸出n行,每行爲輸入對應的八進制正整數。【注意】
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。樣例輸入
2
39
123ABC樣例輸出
71
4435274
思路:
一開始先將十六進制轉換成10進制,再轉換成8進制。結果出錯,因爲數的範圍在2的4*10e5次方範圍內,long long也無法表示,只能字符串來做,就是先把16進制轉換成2進制,再從2進制轉換成8進制。
public class SixteenToEight {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum;
int item;
int start = 0;
for (int count=0; count<n; count++ ) {
String input = sc.next();
String BinaryString = transform(input);
// System.out.println(BinaryString);
int left = BinaryString.length()%3;
String temp = null;
item = 1;
sum = 0;
start = 0;
if ( left==1 ) {
temp = BinaryString.substring(0,left);
for ( int i=left-1; i>=0; i-- ) {
sum += item*(int)( temp.charAt(i)-'0' );
item *= 2;
}
if ( sum!=0 )
System.out.print(sum);
start = 1;
}
if ( left==2 ) {
temp = BinaryString.substring(0,left);
for ( int i=left-1; i>=0; i-- ) {
sum += item*(int)( temp.charAt(i)-'0' );
item *= 2;
}
if ( sum!=0 )
System.out.print(sum);
start = 2;
}
for ( ; start<BinaryString.length(); start+=3 ) {
sum = 0 ;
item = 4 ;
for ( int i=0; i<3; i++ ) {
sum += item*(int)( BinaryString.charAt(i+start)-'0' );
item /=2 ;
}
if ( start==0 && sum==0 ) continue;
System.out.print(sum);
}
System.out.println();
}
}
public static String transform( String origin ) {
StringBuilder ans = new StringBuilder("");
String s = null;
for ( int i=0; i<origin.length(); i++ ) {
switch ( origin.charAt(i) ) {
case '0':
s = "0000";
break;
case '1':
s = "0001";
break;
case '2':
s = "0010";
break;
case '3':
s = "0011";
break;
case '4':
s = "0100";
break ;
case '5':
s = "0101";
break;
case '6':
s = "0110";
break;
case '7':
s = "0111";
break;
case '8':
s = "1000";
break;
case '9':
s = "1001";
break;
case 'A':
s = "1010";
break;
case 'B':
s = "1011";
break;
case 'C':
s = "1100";
break;
case 'D':
s = "1101";
break;
case 'E':
s = "1110";
break;
case 'F':
s = "1111";
break;
default:
break;
}
ans.append(s);
}
return ans.toString();
}
}