蓝桥杯-十六进制转八进制(java实现)

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

以往我们的做法都是逐位进行累乘和累加,但是题目中的信息告诉我们长度很大,longlong一定装不下,并且用单纯的数学类型就会超时(bignums类型)所以我们打算直接从字符串上入手。
我们可以发现,将十六进制的每一位单独用二进制来表示,补齐二进制码使得长度为3的倍数后,没3个二进制码代表的就是八进制对于的二进制码。

在这里插入图片描述
注意,在提取成二进制的时候不用在意0000的出现,但是在转化的时候要考虑开头是000,这种情况要跳过。

import java.io.*;
public class Main {
	public static void main(String [] args) throws IOException {
		BufferedReader line=new BufferedReader(new InputStreamReader(System.in));
		String in="";
		int count=0;
		in=line.readLine();
		count=Integer.valueOf(in);
		
		String []strs=new String[count];
		for(int i=0;i<count;i++) {
			in=line.readLine();
			strs[i]=in;
		}
		
		for(int i=0;i<count;i++) {
			System.out.println(fun1(strs[i]));
		}
	}
	private static String fun1(String str1) {
		int length=str1.length();
		StringBuffer str=new StringBuffer();
		if(length*4%3==1) {		//前面的0不够要用0补齐,使二进制长度成3的倍数
			str.append("00");
		}
		else if(length*4%3==2) {
			str.append("0");
		}
		char[] c=str1.toCharArray();	//换成数组速度更快
		for(int i=0;i<c.length;i++) {
			switch (c[i]) {
				case'0':str.append("0000");break;
				case'1':str.append("0001");break;
				case'2':str.append("0010");break;
				case'3':str.append("0011");break;
				case'4':str.append("0100");break;
				case'5':str.append("0101");break;
				case'6':str.append("0110");break;
				case'7':str.append("0111");break;
				case'8':str.append("1000");break;
				case'9':str.append("1001");break;
				case'A':str.append("1010");break;
				case'B':str.append("1011");break;
				case'C':str.append("1100");break;
				case'D':str.append("1101");break;
				case'E':str.append("1110");break;
				case'F':str.append("1111");break;
			}
		}
		
		StringBuffer ans=new StringBuffer();
		for(int i=0;i<str.length()/3;i++) {
			String t=str.substring(i*3,i*3+3);
			if(i!=0||!t.equals("000")) {
				switch(t) {
				case"000":ans.append("0");break;	//跳过000
				case"001":ans.append("1");break;
				case"010":ans.append("2");break;
				case"011":ans.append("3");break;
				case"100":ans.append("4");break;
				case"101":ans.append("5");break;
				case"110":ans.append("6");break;
				case"111":ans.append("7");break;
				}
			}
		}
		return ans.toString();
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值