java 练习 -蓝桥杯-十六进制转八进制
2014-03-05 22:24
387 查看
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); String[] st=new String ; for(int i=0;i<n;i++) { st[i] =sc.next(); } sc.close(); for(int i=0;i<n;i++) { String str1=ttos(st[i]); int len_str1=str1.length(); if(len_str1%3==1)str1="00"+str1; else if(len_str1%3==2)str1="0"+str1; ttoe(str1); System.out.println(); } } public static String ttos(String str) { int len_str=str.length(); StringBuilder str2=new StringBuilder(); for(int i=0;i<len_str;++i) { switch(str.charAt(i)) { case '0':str2.append("0000");break; case '1':str2.append("0001");break; case '2':str2.append("0010");break; case '3':str2.append("0011");break; case '4':str2.append("0100");break; case '5':str2.append("0101");break; case '6':str2.append("0110");break; case '7':str2.append("0111");break; case '8':str2.append("1000");break; case '9':str2.append("1001");break; case 'A':str2.append("1010");break; case 'B':str2.append("1011");break; case 'C':str2.append("1100");break; case 'D':str2.append("1101");break; case 'E':str2.append("1110");break; case 'F':str2.append("1111");break; default:break; } } return str2.toString(); } public static void ttoe(String str2) { int len=str2.length(); int a; a=(str2.charAt(0)-'0')*4+(str2.charAt(1)-'0')*2+(str2.charAt(2)-'0'); if(a!=0)System.out.print(a); for(int i=3;i<=len-2;i+=3) { a=(str2.charAt(i)-'0')*4+(str2.charAt(i+1)-'0')*2+(str2.charAt(i+2)-'0'); System.out.print(a); } } }
思路分析:
题目要求输入n个十六进制的数进行转换,因N不超过10,可以用字符串数组进行存储,然后依次进行转换。
函数:
1. public static Stringttos(String str) 传递保存在字符串数组的的字符串,目的将16进制,转换成二进制字符串(三位二进制数对应一个8进制数)。函数返回转换后的二进制字符串。使用StringBuilder 效率更高效
2. 接着需要将二进制字符串转换成八进制,在此之前需要进行小小的调整
需要将字符串长度调整为3的倍数,方便转换,考虑到从尾部开始计算,需要借助数组或其他的集合进行存储,无法满足题目的运行要求;
3 于是考虑从头部做文章,记二进制字符串长度为len;当len%3=0时刚好方便转换,
当len%3=1时,试想最后剩余第一位数str.chatAt(0)单独转换,考虑在前面补上“00”后,
可以全部三位一起转换,且不影响最终结果,当len%3=2时同理补上“0”;
4 public static void ttoe(String str2)将处理过的二进制字符转转换成八进制,并且进行边转换边输出,提高效率。