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