蓝桥杯 十六进制转八进制(Java)

资源限制

时间限制:1.0s 内存限制:512.0MB

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

解题思路

1.解决超时问题:预先将16进制对应的二进制字符串存在字符串数组中,通过下标对应转换。

2.先将16进制转为2进制,再转为8进制时会存在不是3的倍数,解决办法就是在字符串前面添“0”

3.八进制数不能存在先导0。

为什么会存在先导0?

当16进制转2进制时,可能就会存在开头有0的情况,如1(16)——>0001(2),此时若转换为8进制,8进制的开头就极有可能为0。

解决:输出前判断先导是否为0,为0就删除0再输出

代码

import java.util.*;
class Main{
	//为了解决超时问题,可以先将要转换的数组存储下来,通过数组下标直接转换
	static String []str= {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
	
    public static void main(String args[]) {
		Scanner cin=new Scanner(System.in);
		int n=cin.nextInt();
		StringBuffer num=new StringBuffer();
		
		String []nums=new String[n];
		for(int i=0;i<n;i++) {
			nums[i]=cin.next();
		}
		for(int i=0;i<n;i++) {
			num=transform(nums[i]);
			
			if(num.substring(0,1).equalsIgnoreCase("0")) {//为啥会有先导0:16进制转2进制时会有0,当不为3的整数时在添0,所以会有先导0
				String result=num.substring(1);
				System.out.println(result);
			}
			else System.out.println(num);
		}
		cin.close();
	    
	}
	static StringBuffer transform(String num) {
		int start=0;
		int end=1;
		String s="";//截取字符串
		StringBuffer str=new StringBuffer();//接收转换的二进制字符
		while(end<=num.length()) {
			s=num.substring(start, end);
			String s1=transform1(s);
			str.append(s1);
			start++;
			end++;
		}//将16进制转换为2进制
		//System.out.println(str.length());
		String result="";
		if(str.length()%3==1) {
			 result="00"+str;
		}
		else if(str.length()%3==2) {
			result="0"+str;
		}
		else result=str.toString();
		//System.out.println(result);
		StringBuffer Str=new StringBuffer();
		start=0;
		end=3;
		for(int j=0;j<result.length()/3;j++) {
			 s=result.substring(start,end);
			 start+=3;
			 end+=3;
			 String s2=transform2(s);
			 Str.append(s2);
			 
		}
		return Str;
	}
	static String transform1(String s) {
		String result="";
		switch(s) {
		case "0":result=str[0]; break;
		case "1":result=str[1]; break;
		case "2":result=str[2]; break;
		case "3":result=str[3]; break;
		case "4":result=str[4]; break;
		case "5":result=str[5]; break;
		case "6":result=str[6]; break;
		case "7":result=str[7]; break;
		case "8":result=str[8]; break;
		case "9":result=str[9]; break;
		case "A":result=str[10]; break;
		case "B":result=str[11]; break;
		case "C":result=str[12]; break;
		case "D":result=str[13]; break;
		case "E":result=str[14]; break;
		case "F":result=str[15]; break;
       	}
		return result;
	}
	static String transform2(String s) {
		String result="";
		switch(s) {
		case "000":result="0";break;
		case "001":result="1";break;
		case "010":result="2";break;
		case "011":result="3";break;
		case "100":result="4";break;
		case "101":result="5";break;
		case "110":result="6";break;
		case "111":result="7";break;
		}
		return result;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值