目录
1 问题描述
具体问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
2 解决方案
2.1 注意问题
解决方案:
2.2 具体实现代码
package com.liuzhen.systemExe; import java.util.Scanner; public class Main {
//把16进制字符串转成2进制字符串
public String getSixteenToTwo(String A){
StringBuilder result = new StringBuilder("");
char[] arrayA = A.toCharArray();
for(int i = 0;i < arrayA.length;i++){
int temp;
if(arrayA[i] >= 'A' && arrayA[i] <= 'F'){
temp = arrayA[i] - 'A' + 10;
}
else
temp = arrayA[i] - '0';
result.append(getNumberToTwo(temp)); }
String result1 = result.toString();
return result1;
}
//把一个数字0~15转换成4位2进制
public String getNumberToTwo(int n){
StringBuilder result = new StringBuilder("");
for(int i = 0;i < 4;i++){
int temp = n%2;
result.append(temp);
n = n/2;
}
String temp1 = result.toString();
temp1 = getReverseString(temp1);
return temp1;
}
//把2进制字符串转成8进制字符串
public String getTwoToEight(String A){
if(A.length() % 3 == 1)
A = "00" + A;
if(A.length() % 3 == 2)
A = "0" + A;
char[] arrayA = A.toCharArray();
StringBuilder result = new StringBuilder("");
int count = 0;
int tempResult = 0;
for(int i = arrayA.length-1;i >= 0;i--){
int temp = arrayA[i] - '0';
tempResult += (int) (temp*Math.pow(2, count++));
if(count == 3){
count = 0;
result.append(tempResult);
tempResult = 0;
}
}
String result1 = result.toString();
result1 = getReverseString(result1);
result1 = getNonoZeroString(result1);
return result1;
}
//反转字符串
public String getReverseString(String A){
char[] arrayA = A.toCharArray();
int start = 0;
int end = arrayA.length-1;
while(start < end){
char temp = arrayA[start];
arrayA[start++] = arrayA[end];
arrayA[end--] = temp;
}
return String.valueOf(arrayA);
}
//去掉字符串前面的0
public String getNonoZeroString(String A){
char[] arrayA = A.toCharArray();
int count = 0;
for(int i = 0;i < arrayA.length;i++){
if(arrayA[i] == '0')
count++;
else
break;
}
char[] result = new char[arrayA.length-count];
for(int i = 0;i < arrayA.length-count;i++)
result[i] = arrayA[count+i];
return String.valueOf(result);
} public static void main(String[] args){
Main test = new Main();
Scanner in = new Scanner(System.in);
//System.out.println("请输入一个正整数n:");
int n = in.nextInt();
in.nextLine();
//System.out.println("请输入n个十六进制数:");
String[] A = new String[n];
for(int i = 0;i < n;i++){
String temp = in.nextLine();
A[i] = temp;
}
in.close();
String[] result = new String[n];
for(int i = 0;i < n;i++){
result[i] = test.getTwoToEight(test.getSixteenToTwo(A[i]));
System.out.println(result[i]);
}
}
}
PS:提交了9次。。。