蓝桥杯 十六进制转八进制

本文详细介绍了使用Java进行十六进制数到八进制数的转换,包括直接调用函数的方法及自定义算法的实现。通过对比两种方法,解释了如何在遇到评测系统不通过时调整代码逻辑,最终采用将十六进制转换为十进制再进行八进制转换的策略,并深入理解了栈操作在算法实现中的应用。

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

首先,在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()弹栈函数把栈顶数据弹出栈,判断栈非空则继续打印出新的栈顶数据,直到栈为空。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值