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(); } }