蓝桥杯练习题之十六进制转八进制

来源:互联网 发布:电钢琴怎么选 知乎 编辑:程序博客网 时间:2024/06/01 10:27

基础练习 十六进制转八进制  

时间限制:1.0s   内存限制:512.0MB
   
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。


这道题博主我做了好久,几经修改终于满分通过了测试.

第一次提交时,我用eclipse测试了都无误,然鹅.....

运行超时了....!!

先上我之前的代码吧~

package hexadecimalToOctal;import java.util.Scanner;public class Main {/** * 问题描述  给定n个十六进制正整数,输出它们对应的八进制数。输入格式  输入的第一行为一个正整数n (1<=n<=10)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式  输出n行,每行为输入对应的八进制正整数。 * @param args */public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();       String[] in = new String[n];   String[] out = new String[n];for (int i = 0; i < n; i++) {in[i] = input.next();int len = in[i].length();int j = len%3;String strIn = "";String strOut = "";if (j == 1) {strIn = in[i].charAt(0) + "";strOut = trans(strIn);} else if (j == 2) {strIn = in[i].charAt(0) + "" + in[i].charAt(1) + "";strOut = trans(strIn);} else {strOut = "";}while (j < in[i].length()) {strIn = in[i].charAt(j) + "" + in[i].charAt(j + 1) + "" + in[i].charAt(j + 2) + "";strOut += trans(strIn);j += 3;}out[i] = strOut;}for (String string : out) {System.out.println(string);}input.close();}private static String trans(String strIn) {      //return Integer.toString(Integer.parseInt(strIn,16),8);        //十六进制转二进制          String bs = Integer.toBinaryString(Integer.valueOf(strIn, 16));          //二进制转八进制          String os = Integer.toOctalString((Integer.valueOf(bs, 2)));          return os;}  }

这里再放上我eclipse上的测试结果:

我第一次提交的那段代码思路是没错的,错就错在我主函数里用了人家自带的进制转换函数!!! 这就是超时的关键点所在.

emmm,无奈系统有运行时间及内存的限制,我只能自己实现进制转换的方法.


代码搁置了两天后我用了好几个小时将代码从头改到了尾(大家别笑我菜).

几经周折终于满分通过了评测.


咳咳,不绕弯子了,直接上代码~

import java.util.Scanner;public class Main {public static void main(String[] args) {/* 输入 */Scanner input = new Scanner(System.in);int n = input.nextInt();String[] str = new String[n];for (int i = 0; i < n; i++) {str[i] = input.next();}input.close();StringBuffer sb = new StringBuffer();for (int i = 0; i < n; i++) {/* 十六进制转二进制 */for (int j = 0; j < str[i].length(); j++) {char ch = str[i].charAt(j);switch (ch) {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;}}/* 二进制转十六进制 */if (sb.length() % 3 == 0) {if (sb.substring(0, 3).equals("000")) {sb.delete(0, 3);}} else if (sb.length() % 3 == 1) {if (sb.substring(0, 1).equals("0")) {sb.delete(0, 1);} else {sb.insert(0, "00");}} else if (sb.length() % 3 == 2) {if (sb.substring(0, 2).equals("00")) {sb.delete(0, 2);} else {sb.insert(0, "0");}}int[] c = new int[sb.length()/3];int m = 0;for (int k = 0; k < sb.length(); k+=3) {String string = sb.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();sb.delete(0, sb.length());}}}

以上代码有一点需要注意的地方.

在第一个数完成了十六进制到八进制的转换之后别忘了将缓存区清空,不然的话StringBuffer做为中转站对第二个数进行进制转换时前面的数也依然存在在StringBuffer成为后面数的一部分,结果........大家懂得~



接下来就直接上结果图, 有不懂之处欢迎留言或私信哦~

    




喜欢就请关注我,你们的关注是我最大的动力~

相关代码链接:https://github.com/striner/javaCode/blob/master/hexadecimalToOctal