java蓝桥杯 十六进制八进制

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


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


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


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


样例输入
  2
  39
  123ABC


样例输出
  71

  4435274

 

代码如下:

 

import java.util.*;

public class Main{
	public static String g(String s) {
		StringBuffer s1 = new StringBuffer("");
		for (int i=0; i<s.length();i++) {
			switch(s.charAt(i)) {
			case '0': s1.append("0000"); break;
			case '1': s1.append("0001"); break;
			case '2': s1.append("0010"); break;
			case '3': s1.append("0011"); break;
			case '4': s1.append("0100"); break;
			case '5': s1.append("0101"); break;
			case '6': s1.append("0110"); break;
			case '7': s1.append("0111"); break;
			case '8': s1.append("1000"); break;
			case '9': s1.append("1001"); break;
			case 'A': s1.append("1010"); break;
			case 'B': s1.append("1011"); break;
			case 'C': s1.append("1100"); break;
			case 'D': s1.append("1101"); break;
			case 'E': s1.append("1110"); break;
			case 'F': s1.append("1111"); break;
			}
		}
		return s1.toString();
	}
	
	public static String h(String b) {
		StringBuffer s1 = new StringBuffer("");
		for(int i=0; i<b.length(); i+=3) {
			String s = b.substring(i, i+3);
			switch(s) {
			case "000" : s1.append("0");break;
			case "001" : s1.append("1");break;
			case "010" : s1.append("2");break;
			case "011" : s1.append("3");break;
			case "100" : s1.append("4");break;
			case "101" : s1.append("5");break;
			case "110" : s1.append("6");break;
			case "111" : s1.append("7");break;
			}
		}
		return s1.toString();
	}
	
	public static void f(String s) {
		String b = g(s);
		int m = b.length()%3;
		if(m==1) b = "00"+b;
		if(m==2) b = "0"+b;
		String c = h(b);
		if (c.charAt(0)=='0')System.out.println(c.substring(1,c.length()));
		else System.out.println(c);
	}
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		while(n-->0) {
			String s = in.next();
			f(s);
		}
	}
}

这个题的思路并不是太困难,就是先把十六进制数转化成对应的2进制数,再把二进制数先通过前面补0的方法补成3的倍数的长度,然后每三位转为为一个八进制数。

 

再输出八进制数的的时候,要删掉其开头出现的0.这个题我之前写的程序一直超时,仔细检查还是因为太粗心。这个题锻炼了我对java字符串函数的使用。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值