蓝桥杯 十六进制转八进制

最近在做蓝桥杯上的算法题的时候,觉得有一些东西需要自己小结一下,方便以后查阅。

首先,在java里有专门的函数可以调用,将十六进制转化为八进制。我试了一下在我的eclipse运行ok了,但是提交到蓝桥杯的评测系统上就是通不过。以下是代码:

public static void main(String[] args){
		Scanner scan =  new Scanner(System.in);
		int n=scan.nextInt();
		String[] array1 = new String[n];
		String[] array2 = new String[n];
		for(int i=0;i<array1.length;i++){
			String m=scan.next();
			array1[i]=m;
		}
		for(int i=0;i<array2.length;i++){
			array2[i]=Long.toOctalString(Long.parseLong(array1[i],16));
			System.out.println(array2[i]);
		}
	}   


后来发现与题目要求不符,然后又想了另外一种方法:

static int  fun(String s){
	    	int n = s.length();
	    	int sum =0,a=1;
	    	for(int i =n-1;i>=0;i--){
	    	    char b =s.charAt(i);
	    	    if(b >='0'&&b<='9')
	    	    	sum =sum+(b-'0')*a;
	    	    else 
	    	    if(b>='A'&&b<='F')
	    	    	sum+=(b+10-'A')*a;
	    	    a=a*16;
	    	}
	    	return sum;
	    }
     public static void fun8(int x){
    	 Stack<Integer> st =new Stack<Integer>();
    	 while(x>0){
    		 st.push(x%8);
    		 x=(int)(x/8);     //注意:x为int类型  取整后为零
    	 }
    	 while(!st.isEmpty()){
    		 System.out.print(st.peek());
    		 st.pop();
    	 }
    	 System.out.println();
     }
     public static void main(String[] args){
    	 Scanner sc = new Scanner(System.in);
    	 int n =sc.nextInt();
	    String[] array1=new String[n];
	    int[] x =new int[n];
	    for(int i =0;i<array1.length;i++){
	    	String m =sc.next();
	    	array1[i] = m;
	    }
	      for(int i=0;i<array1.length;i++)
	      {
	    	  x[i] =fun(array1[i]);
	      }
	      for(int i=0;i<array1.length;i++)
	    	  fun8(x[i]);
     }

第二种方法先把十六进制转化为十进制(fun()函数)然后再用了栈来存放每一位十进制转换为八进制(fun1()函数)的数据。

while(!st.isEmpty()){
    		 System.out.print(st.peek());
    		 st.pop();

此处栈的操作起初我也没搞明白,后来想想。应该是这样理解的:st.peek()函数即指向栈顶数据,然后打印出栈顶数据。st.pop()弹栈函数把栈顶数据弹出栈,判断栈非空则继续打印出新的栈顶数据,直到栈为空。

猜你喜欢

转载自blog.csdn.net/msdumin/article/details/18141257
今日推荐