您的位置:首页 > 其它

蓝桥杯 十六进制转八进制 字符串处理

2018-03-11 14:57 148 查看
问题描述

  给定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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: