http://lx.lanqiao.cn/problem.page?gpid=T51
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
注意: java很容易超时的,要尽量优化,如可以枚举的就枚举好,做好字典;字符串拼接,注意不用stringBuilder和StringBuffer,不要用string;
java尽量避免复杂度乘以2都可能导致超时!!!
傻逼超时解法:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
cin.nextLine(); //吃掉回车
String[] a = new String[n];
for(int i = 0 ; i < n; i++) {
a[i] = cin.nextLine().trim();
// System.out.println("--" + a[i]);
}
for(int j = 0; j < n; j++) {
String bastr = "";
for(int i = 0; i < a[j].length(); i++) {
char[] tp = {'0', '0','0', '0'};
int t;
if(a[j].charAt(i) > '9') {
t = (a[j].charAt(i) - 'A') + 10;
}
else {
t = a[j].charAt(i) - '0';
}
// System.out.println("at:" + a[0].charAt(i));
int ct = 3;
while(t != 0) {
tp[ct--] = (char) ((t % 2) + '0');
t = t / 2;
}
String str = new String(tp);
// System.out.println(str);
bastr = bastr + str;
}
// System.out.println(bastr);
int s = bastr.length() % 3;
if(s > 0) {
for(int i = 0; i < 3 - s; i++) {
bastr ="0" + bastr;
}
}
StringBuilder ba = new StringBuilder();
for(int i = 0 ; i < bastr.length(); i += 3) {
// System.out.println(bastr.charAt(i) + bastr.charAt(i+1) + bastr.charAt(i+2));
ba.append( String.valueOf( (bastr.charAt(i) - '0') * 4 + (bastr.charAt(i+1) - '0') * 2 + (bastr.charAt(i+2) - '0') * 1));
}
System.out.println(ba.toString().replaceAll("^(0+)", ""));
}
}
}
c++不超时版:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
string str;
string two[17] = {"0000", "0001", "0010", "0011",
"0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011",
"1100", "1101", "1110", "1111"};
int main(){
int n;
cin >> n;
while(n--){
cin >> str;
string ss;
string ans;
for(int i = 0; i < str.length(); i++){
if(str[i] >= '0' && str[i] <= '9'){
ss += two[str[i] - '0'];
}
else{
ss += two[str[i] - 'A' + 10];
}
}
// cout << ss << endl;
int sum = 0;
for(int i = ss.length() - 1; i >= 0; i--){
if(i == 1){
if(ss[i] == '0' && ss[i - 1] == '0'){
break;
}
sum = (ss[i] - '0') * 1 + (ss[i - 1] - '0') * 2;
ans += (sum + '0');
// cout << sum << "i " << i << endl;
break;
}
else if(i == 0){
if(ss[i] == '0'){
break;
}
sum = (ss[i] - '0') * 1;
ans += (sum + '0');
// cout << sum << "i " << i << endl;
break;
}
else{
sum = (ss[i] - '0') * 1 + (ss[i - 1] - '0') * 2 + (ss[i - 2] - '0') * 4;
ans += (sum + '0');
i -= 2;
// cout << sum << "i " << i << endl;
}
}
int flag = 0;
for(int i = ans.length() - 1; i >= 0; i--){
char ch = ans[i];
// if(ch != '0' || flag == 1){
cout << ans[i];
flag = 1;
// / }
// else if(flag == 1){
// cout << ans[i];
// }
}
cout << endl ;
}
return 0;
}
java不超时版:
一:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
String[] str = new String[n];
for(int i = 0; i < n; i++) {
str[i] = cin.next();
}
// cin.close();
for(int i = 0; i < n; i++) {
String strBinary = toBinay(str[i]);
// System.out.println(strBinary);
int len = strBinary.length();
if(len % 3 == 1) {
strBinary = "00" + strBinary;
}
else if(len % 3 == 2) {
strBinary = "0" + strBinary;
}
String strBa = toBa(strBinary);
System.out.println(strBa);
}
}
public static String toBa(String str) {
StringBuffer ans = new StringBuffer();
int len = str.length();
int k = 0;
if(str.substring(0,3).equals("000")) {
k = 3;
}
else {
k = 0;
}
for(int i = k; i < len - 2; i+=3) {
switch(str.substring(i, i+3)) {
case "000": ans.append("0"); break;
case "001": ans.append("1"); break;
case "010": ans.append("2"); break;
case "011": ans.append("3"); break;
case "100": ans.append("4"); break;
case "101": ans.append("5"); break;
case "110": ans.append("6"); break;
case "111": ans.append("7"); break;
}
}
return ans.toString();
}
public static String toBinay(String str) {
StringBuffer ans = new StringBuffer();
int len = str.length();
for(int i = 0; i < len; i++) {
switch(str.charAt(i)) {
case '0': ans.append("0000"); break;
case '1': ans.append("0001"); break;
case '2': ans.append("0010"); break;
case '3': ans.append("0011"); break;
case '4': ans.append("0100"); break;
case '5': ans.append("0101"); break;
case '6': ans.append("0110"); break;
case '7': ans.append("0111"); break;
case '8': ans.append("1000"); break;
case '9': ans.append("1001"); break;
case 'A': ans.append("1010"); break;
case 'B': ans.append("1011"); break;
case 'C': ans.append("1100"); break;
case 'D': ans.append("1101"); break;
case 'E': ans.append("1110"); break;
case 'F': ans.append("1111"); break;
}
}
return ans.toString();
}
}
二:
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
String[] two = {
"0000", "0001", "0010", "0011",
"0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011",
"1100", "1101", "1110", "1111",
};
int n = cin.nextInt();
// cin.nextLine(); //吃掉回车
while(n > 0) {
n--;
String str = cin.next();
//转为二进制
// String ans = ""; //string 在大量拼接时会超时
// int len = str.length();
// for(int i = 0; i < len; i++) {
// if(str.charAt(i) < 'A') {
// ans = ans + two[str.charAt(i) - '0'];
// }
// else {
// ans = ans + two[str.charAt(i) - 'A' + 10];
// }
// }
int len = str.length();
// StringBuffer ans = new StringBuffer(len); //一下如果用String会超时,stringbuffer和stringbuilder都可以
StringBuilder ans = new StringBuilder();
for (int i = 0; i < len; i++) {
if (str.charAt(i) < 'A' && str.charAt(i) >= '0') {
ans.append(two[str.charAt(i) - '0']);
}
else {
ans.append(two[str.charAt(i) - 'A' + 10]);
}
}
String ans2 = ans.toString();
// System.out.println("ans2" + ans2);
//凑齐3的倍数
int len2 = ans2.length();
if(len2 % 3 == 1) {
ans2 = "00" + ans2;
}
else if(len2 % 3 == 2){
ans2 = "0" + ans2;
}
//开始转为八进制
int k = 0;
if(ans2.substring(0, 3).equals("000")) {
k = 3;
}
else {
k = 0;
}
len2 = ans2.length();
StringBuilder ansout = new StringBuilder();
for(int i = k; i < len2 - 2; i += 3) {
int ten = (ans2.charAt(i) - '0') * 4 + (ans2.charAt(i+1) - '0') * 2 + (ans2.charAt(i+2) - '0');
ansout.append(String.valueOf(ten) );
}
System.out.println(ansout);
}
cin.close();
}
}