问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
找了一天错误
package lanqiao_jichu;
import java.util.Scanner;
//没过 输入是加了while循环导致运行超时
public class shiliu_shift_ba {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String[] strings = new String[n];
//String str;
for (int i = 0; i < n; i++) {
String s=scanner.next();
strings[i] = s;
// System.out.println(strings[i]);
}
shift2(strings,n);//转二进制
/* for (int j = 0; j < n; j++) {
// int i,len=0;//从每个串的第一个字符进行判断
String str="";
int len=strings[j].length();
int i=len;
StringBuilder sb=new StringBuilder();
while (i!=0){
switch (strings[j].charAt(len-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--;
}
str=sb.toString();
if (str.length()%3==1) str="00"+str;
else if (str.length()%3==2) str="0"+str;
// System.out.println("str:"+str);
shift8(str);
System.out.println();
}
// }*/
}
public static void shift2(String[] strings,int n){
for (int j = 0; j < n; j++) {
// int i,len=0;//从每个串的第一个字符进行判断
String str="";
StringBuilder sb=new StringBuilder();
int len=strings[j].length();
int i=len;
while (i!=0){
switch (strings[j].charAt(len-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--;
}
str=sb.toString();
if (str.length()%3==1) str="00"+str;
else if (str.length()%3==2) str="0"+str;
// System.out.println("str:"+str);
shift8(str);
System.out.println();
}
}
public static void shift8(String str){
int len= str.length();
int num = (str.charAt(0)-'0')*4 +(str.charAt(1)-'0')*2+(str.charAt(2)-'0');//从左到右算首部
//首部3位换算结果 若为0则不输出 否则输出
if (num!=0) System.out.print(num);//一开始写的println 提交答案错误
for (int i=3; i<len; i+=3){
num = (str.charAt(i)-'0')*4 +(str.charAt(i+1)-'0')*2+(str.charAt(i+2)-'0');//从左第4位数开始,每3位换算
System.out.print(num);
}
}
}
别人的思路
1位16进制可以代表4位2进制, 1位8进制可以代表3位二进制,得出3位16进制求和入栈输出表示4位8进制,然后出栈输出。
而且String str1=Integer.toOctalString(stack[i]);//从10进制转化成8进制
package lanqiao_jichu;
import java.util.Scanner;
public class Mains {
public static void main(String[] args) {
new Mains().systemScanner();
}
public void systemScanner() {
Scanner jin = new Scanner(System.in);
while (jin.hasNext()) {
int length = jin.nextInt();
for (int i = 0; i < length; i++){
String strTmp=jin.next();
tranform(strTmp.toCharArray(), strTmp.length());
}
}
}
/*
* 3位16进制等价于4位8进制
*/
int[] stack=new int[40000];
public void tranform(char[] str, int length) {
char[] buff = new char[4];
int top = -1;
for (int i = length - 1; i >= 0; i -= 3) {
int sum = 0;
for (int j = 0; j < 3 && i - j >= 0; j++) {// i-j>=0防止不够三个的情况
int tmp = str[i - j] >= '0' && str[i - j] <= '9' ? str[i - j] - '0'
: str[i - j] - 'A' + 10;//区分是数字,还是字符,进行对应转换
sum+=(tmp<<(4*j));//这句很重要,通过这句就可以从16变成10进制了,不过,不知道为什么?是如何得出的呢?而且进行累加之后就能得到最终的结果很神奇
}
stack[++top]=sum;//sum的结果是16进制转化10进制的结果,每3个16进制变成10进制,再变8进制
}
while(stack[top]==0){//排除前导为0的判断
top--;
}
// for(int i=top;i>=0;i--){//直接输出会丢失前导0,因为此转化成8进制并不是最左边的情况,应该保留0
// System.out.print(Integer.toOctalString(stack[i]));//从10进制转化成8进制
// }
for(int i=top;i>=0;i--){
String str1=Integer.toOctalString(stack[i]);//从10进制转化成8进制
if(i!=top&&str1.length()<4){
//不是最左边的一个,就不用去掉前导0,而默认是去掉0的,所以要进行补会
for(int y=0;y<4-str1.length();y++)
System.out.print("0");
}
System.out.print(str1);
}
System.out.println();
}
}
java 二、八、十、十六进制之间的转换
public static void main(String[] args) {
int n1 = 14;
//十进制转成十六进制:
System.out.println(Integer.toHexString(n1));
//十进制转成八进制
System.out.println(Integer.toOctalString(n1));
//十进制转成二进制
System.out.println(Integer.toBinaryString(12));
//十六进制转成十进制
System.out.println(Integer.valueOf(“FFFF”,16).toString());
//十六进制转成二进制
System.out.println(Integer.toBinaryString(Integer.valueOf(“FFFF”,16)));
//十六进制转成八进制
System.out.println(Integer.toOctalString(Integer.valueOf(“FFFF”,16)));
//八进制转成十进制
System.out.println(Integer.valueOf("576",8).toString());
//八进制转成二进制
System.out.println(Integer.toBinaryString(Integer.valueOf("23",8)));
//八进制转成十六进制
System.out.println(Integer.toHexString(Integer.valueOf("23",8)));
//二进制转十进制
System.out.println(Integer.valueOf("0101",2).toString());
//二进制转八进制
System.out.println(Integer.toOctalString(Integer.parseInt("0101", 2)));
//二进制转十六进制
System.out.println(Integer.toHexString(Integer.parseInt("0101", 2)));
}