蓝桥杯:十六进制转八进制(java)

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

   提示

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

先来讲讲我的思路,以及写这道题的过程,希望能给需要的同学一点帮助。

做这道题之前呢,很容易的就把十六进制转十进制解决,接着解决了十进制转十六进制。最开始的思路呢,认为前两个问题解决了,合在一起然后稍加改动就行了,后来证明事大错特错了,自己在IDE验证时没问题的,代码也很长,但是一提交发现,测试数据真的有100000位的,我也是服了,数据溢出时必然存在的了。运行时直接显示错误。

接下来,在网上搜索了一下,在这里不得不说StringBuffer是真的好啊,运行也非常快,然后把十六进制转换为二进制,用的是switch语句,接下来在把二进制转换为八进制的时候遇到了问题,先使用的是if,else if语句,然后比较重要的一个问题就是前端补0以及在生成八进制的时候去掉前导0的问题,这两个问题直接看代码就OK了,然后提交了一遍,超时。。。

后来在转换为八进制的时候用的switch语句,提交还是超时,又在网上看了大佬前辈的代码,意识到二转八不用这么麻烦,可以直接得出来,然后一个数字一个数字的输出,提交,用时900多ms,再一次提交居然超时,接着改,最后在输出的时候又用到了StringBuffer,这回提交500ms,完美,希望看到这篇文章的如果有更加优化的办法,欢迎留言。

·StringBuffer的append(),substring(),charAt()方法

下面看代码:



import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
String[] s = new String[n];
for(int i=0; i<n; i++) {
s[i] = input.next();
}
for(int i=0; i<n; i++) {
StringBuffer sb = new StringBuffer();
if(s[i].length() * 4 % 3 == 1) {
sb.append("00");
} else if(s[i].length() * 4 % 3 == 2) {
sb.append("0");

for(int j=0; j<s[i].length(); j++) {
switch(s[i].charAt(j)) {
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;
}
}
long num = 0;
StringBuffer sf = new StringBuffer();
for(int m=0; m<sb.length(); m+=3) {
num = (sb.charAt(m) - '0') * 4 + (sb.charAt(m + 1) - '0') * 2 + (sb.charAt(m+2) - '0');
sf.append(num);
}
if(sf.substring(0,1).equals("0")) {
System.out.print(sf.substring(1));
} else {
System.out.print(sf);
}
System.out.println();
}
}
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值