http://lx.lanqiao.cn/problem.page?gpid=T51
题意:将16进制数转化为8进制数
思路:由于字符串比较长,所以只能通过字符串模拟来做。先将16进制转为2进制,再逆序将2进制转化为8进制。这么做的原因是:每4位二进制刚好对应一个16进制数,每3个二进制数刚好对应一个8进制数。
反思:这题虽然简单,但是却可以很好的复习java基本语法,栈,map,String,StringBuffer等。
代码:
import java.util.*;/*** @ClassName Fabio* @Description TODO* @Auther ydc* @Date 2019/3/23 11:05* @Version 1.0**/
public class Main {static String changeTo2(String s){Map<Character,Integer> mp = new HashMap<>();mp.put('A',10);mp.put('B',11);mp.put('C',12);mp.put('D',13);mp.put('E',14);mp.put('F',15);int n=s.length();StringBuffer ans = new StringBuffer();for(int i=0;i<n;i++){int tmp=0;if(s.charAt(i)>='A'){tmp=mp.get(s.charAt(i));}else{tmp= Integer.parseInt(String.valueOf(s.charAt(i)));}Stack<Integer> stack = new Stack<>();for(int j=0;j<4;j++){stack.push(tmp%2);tmp/=2;}while (!stack.empty()){ans.append(stack.peek());stack.pop();}}return ans.toString();}static String changeTo8(String s){int a[] = new int[3];a[0]=1;a[1]=2;a[2]=4;int n=s.length();StringBuffer ans= new StringBuffer();Stack<Integer> stack = new Stack<>();for(int i=n-1;i>=0;i--){int k=0;int tmp=0;while(k<3&&i>=0){//System.out.println(a[k]+" ."+String.valueOf(s.charAt(i)));tmp+=a[k]* Integer.parseInt(String.valueOf(s.charAt(i)));k++;if(k<3) i--;}//System.out.println(i);//System.out.println(tmp);stack.push(tmp);}if(stack.peek()==0){stack.pop();//不能有前导0}while (!stack.empty()){
// if(stack.peek()==0){
// stack.pop();
// continue;
// }ans.append(stack.peek());stack.pop();}return ans.toString();}public static void main(String argc[]) {Scanner cin = new Scanner(System.in);int n=cin.nextInt();for(int i=0;i<n;i++){String s = cin.next();// System.out.println(changeTo2(s));System.out.println(changeTo8(changeTo2(s)));}}}