问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
解题思路:思路就是将十六进制转换为二进制,再将二进制转换为八进制。
按照上面的思路,用java进行了实现,代码如下:
import java.util.*;
public class Main {
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
while(N>=0) {
String string = scanner.nextLine();
String s = "";
for(int i=0;i<string.length();i++) {
char c = string.charAt(i);
switch (c) {
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;
}
}
int len = s.length();
if(len%3==1)
s = "0"+s;
if(len%3==2)
s = "00"+s;
//String tmp = "";
int sum = 0;
int flag = 0;
for(int i=0;i<s.length();i+=3) {
sum = (4*(s.charAt(i)-'0')+2*(s.charAt(i+1)-'0')+s.charAt(i+2)-'0');
// if(i==0&&sum==0) {
// sum = 0;
// continue;
// }
// tmp+=sum;
// sum = 0;
if(sum!=0)
flag=1;
if(flag==1)
System.out.print(sum);
}
System.out.println();
N--;
}
}
}
但是一直超时,后来百度到了,问题可能出现在String上面,String是不可变,每次修改字符串都是超时,所以应该用StringBuilder或者StringBuffer。修改后代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
String ss[] = new String[N];
for(int i=0;i<N;i++) {
ss[i] = scanner.next();
}
StringBuffer s = new StringBuffer();
for(int i=0;i<N;i++) {
char cc[] = ss[i].toCharArray();
int len = ss[i].length();
for(int k=0;k<len;k++) {
switch (cc[k]) {
case '0':
s.append("0000");break;
case '1':
s.append("0001");break;
case '2':
s.append("0010");break;
case '3':
s.append("0011");break;
case '4':
s.append("0100");break;
case '5':
s.append("0101");break;
case '6':
s.append("0110");break;
case '7':
s.append("0111");break;
case '8':
s.append("1000");break;
case '9':
s.append("1001");break;
case 'A':
s.append("1010");break;
case 'B':
s.append("1011");break;
case 'C':
s.append("1100");break;
case 'D':
s.append("1101");break;
case 'E':
s.append("1110");break;
case 'F':
s.append("1111");break;
default:
break;
}
}
if (s.length() % 3 == 0)
{
if (s.substring(0, 3).equals("000"))
{
s.delete(0, 3);
}
} else if (s.length() % 3 == 1)
{
if (s.substring(0, 1).equals("0"))
{
s.delete(0, 1);
} else
{
s.insert(0, "00");
}
} else if (s.length() % 3 == 2)
{
if (s.substring(0, 2).equals("00"))
{
s.delete(0, 2);
} else {
s.insert(0, "0");
}
}
int[] c = new int[s.length()/3];
int m = 0;
for (int k = 0; k < s.length(); k+=3)
{
String string = s.substring(k, k + 3);
switch (string) {
case "000":
c[m++] = 0; break;
case "001":
c[m++] = 1; break;
case "010": c[m++] = 2; break;
case "011": c[m++] = 3; break;
case "100": c[m++] = 4; break;
case "101": c[m++] = 5; break;
case "110": c[m++] = 6; break;
case "111": c[m++] = 7; break;
}
}
/* 打印输出 */
for (int j = 0; j < m; j++)
{
System.out.print(c[j]);
}
System.out.println();
s.delete(0, s.length());
// int len2 = s.length();
// String tmp = "";
// if(len2%3==1)
// tmp = "0"+s.toString();
// if(len2%3==2)
// tmp = "00"+s.toString();
// int sum=0,flag=0;
// for(int k=0;k<=tmp.length()-3;k+=3) {
// sum = 4*(tmp.charAt(k)-'0')+2*(tmp.charAt(k+1)-'0')+(tmp.charAt(k+2)-'0');
// if(sum!=0)
// flag=1;
// if(flag==1)
// System.out.print(sum);
// }
// System.out.println();
// s.delete(0, s.length());
}
}
}
我超时的那个代码,用C++来实现的话,交上去能够AC,有点搞不懂。。。
参考文章:
https://yq.aliyun.com/ziliao/243973
http://www.voidcn.com/article/p-siffdpdr-oq.html
https://blog.csdn.net/u010887744/article/details/44889037
https://blog.csdn.net/JiLuoXingRen/article/details/50478759
https://blog.csdn.net/rmn190/article/details/1492013