【JAVA蓝桥杯基础练习】十六进制转八进制

题目:

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

思路:

刚开始写,想都不想直接java 进制api,后面发现这种进制转换api在遇到超级长的数字时就跑不动了,因为题目说低于十万位,显然要求能处理大数字。大数字java api处理不了,可以用字符串来代替。提示也说了,先将十六进制转换为某进制,其实就是二进制数,一个十六进制数换4个二进制数,接着将得到的二进制数转成8进制,3个二进制数换1个八进制数,所以先判断二进制数长度是否为3的倍数,若刚合适,则防止数字前导是三个0,若数字前三位为0则删除;若多出一个数字则判断这个数字是否为0,是0就删除,若不是0,则额外增加2个0;若多出2个,则判断头两个是否为00,若为00,则删除,若不是则在开头加一个0;最后用Integer.parseInt(xxx,2)方法将3个3个的二进制数换成十进制,因为换成十进制最后相接就是我们要得到的8进制数

代码:

import java.util.Scanner;
public class Main {
	 
		//用Integer类自带的二进制,八进制,十六进制
		//Integer.valueOf(a, b)这个的用法和上面那个parseInt一样
		
		  public static void main(String[] args) {
		      Scanner sc=new Scanner(System.in);//输入行数
		      int n=sc.nextInt();
		      String[]s=new String[11];//10行
		      for(int i=0;i<n;i++) {//输入每行字符串
		    	  String ss=sc.next();
		    	  s[i]=ss;
		      }
		      for(int j=0;j<n;j++) {//
		    	  StringBuilder two=new StringBuilder();//2进制
		    	 for(int k=0;k<s[j].length();k++) {
		    		 char num=s[j].charAt(k);
		    		 switch(num) {
		    		 case '0':two.append("0000");break;
		    		 case '1':two.append("0001");break;
		    		 case '2':two.append("0010");break;
		    		 case '3':two.append("0011");break;
		    		 case '4':two.append("0100");break;
		    		 case '5':two.append("0101");break;
		    		 case '6':two.append("0110");break;
		    		 case '7':two.append("0111");break;
		    		 case '8':two.append("1000");break;
		    		 case '9':two.append("1001");break;
		    		 case 'A':two.append("1010");break;
		    		 case 'B':two.append("1011");break;
		    		 case 'C':two.append("1100");break;
		    		 case 'D':two.append("1101");break;
		    		 case 'E':two.append("1110");break;
		    		 case 'F':two.append("1111");break;
		    		 }
		    	 }
		    	 eight(two);
		      }

}
          public static void eight(StringBuilder two) {
	    	  StringBuilder eight=new StringBuilder();//2进制
          	int twolen=two.length();
          	if(twolen%3==0) {//刚好够分配,则判断最前面有无000
          		if(two.substring(0, 3).equals("000")) {
          			two.delete(0, 3);
          		}
          	}
          	else if(twolen%3==1) {//多出一个
          		if(two.substring(0, 1).equals("0")) {
          			two.delete(0, 1);
          		}
          		else {
          			two=two.insert(0, "00");
          		}
          	}
          	else if(twolen%3==2) {//多出两个
          		if(two.substring(0, 2).equals("00")) {
          			two.delete(0, 2);
          		}
          		else {
          			two=two.insert(0, "0");
          		}
          	}
          	int two_newlen=two.length();
          	for(int i=0;i<two_newlen/3;i++) {
          		int N=Integer.parseInt(two.substring(i*3,i*3+3),2);//2进制转化成10进制
          		eight.append(N);
          	}
          	System.out.println(eight);
          }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值