问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
!!!!!!!!!!!!!!!!!!!!!!!!!
>高能注意!!!我写的代码是傻瓜式写法,没有优化。例如switch那儿,可以从A往上加到Z,8421和421那儿也是直接写了if…else…,完全可以递归取代,这些都是可以优化的,但是今天脑袋是木的。就这样啦~还有就是题目要求是输入N行。我直接默认一行了。想添加的可以nextInt接收n,然后存到String数组里头就好了
代码:
import java.util.Scanner;
public class Test {
public static String two(char n) {//转为二进制
int x = 0;
switch (n) {
case 'A':
x = 10;
break;
case 'B':
x = 11;
break;
case 'C':
x = 12;
break;
case 'D':
x = 13;
break;
case 'E':
x = 14;
break;
case 'F':
x = 15;
break;
}
if (n - '0' <= 10) {
x = n - '0';
}
String s = "";
if (x == 0)
{
return "0000";
}
if (x == 1)
{
return "0001";
}
if (x >= 8)
{//8421的8
s += 1;
x -= 8;
} else
{
s += 0;
}
if (x >= 4)
{
s += 1;
x -= 4;
} else
{
s += 0;
}
if (x >= 2)
{
s += 1;
x -= 2;
} else
{
s += 0;
}
if (x == 1)
{
s += 1;
} else
{
s += 0;
}
return s;
}
public static String eight(String n) {
if (n.length() % 3 != 0) {
if (n.length() % 3 == 1) {
n = "00" + n;
} else {
n = "0" + n;
}
}
char[] arr = n.toCharArray();
String s = "";
for (int i = 0; i < n.length(); i += 3) {
int sum = 0;
if (arr[i] - '0' == 1) {
sum += 4;
}
if (arr[i + 1] - '0' == 1) {
sum += 2;
}
if (arr[i + 2] - '0' == 1) {
sum += 1;
}
s += sum + "";
}
return s;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
char[] arr = s.toCharArray();
String s1 = "";
for (int i = 0; i < arr.length; i++) {//转为二进制
s1 += two(arr[i]) + "";
}
String s2 = eight(s1);//转为八进制
int tmp = 0;
for (int i = 0; i < s2.length(); i++) {//去掉首部的0
if (s2.substring(i, i + 1) != "0") {
tmp = i+1;
break;
}
}
System.out.println(s2.substring(tmp));
}
}