基础练习 BASIC-12 十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

   提示

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


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		String[] hex = new String[n];
		
		for (int i=0; i<hex.length; i++){
			hex[i] = sc.next();
		}
		
		for (int i=0; i<hex.length; i++){
			hexToOctal(hex[i]);
		}
	}

	public static void hexToOctal(String s) {
		// TODO Auto-generated method stub
		String hexs = "0123456789ABCDEF";
		String octal = "01234567";
		
		String []hb = {"0000","0001","0010","0011","0100","0101","0110","0111",
				"1000","1001","1010","1011","1100","1101","1110","1111"}; 
		
		String []ob = {"000","001","010","011","100","101","110","111"};
		
		List<String> listtob = new ArrayList<String>();
		
		for (int i=0; i<ob.length; i++){
			listtob.add(ob[i]);
		}
		
		StringBuffer bstr = new StringBuffer();
		
		for (int i=0; i<s.length(); i++){
			int h = hexs.indexOf(s.charAt(i));
			bstr.append(hb[h]);
		}
		
		if(bstr.length()%3==1){
			bstr = bstr.insert(0, "00",0,2);
		}
		if(bstr.length()%3==2){
			bstr = bstr.insert(0, "0",0,1);
		}
		
		StringBuffer octalStr = new StringBuffer();
		
		for (int i=0; i<bstr.length(); i=i+3){
			String str = (String) bstr.subSequence(i, i+3);
			int num = listtob.indexOf(str);
			octalStr = octalStr.append(octal.charAt(num));
		}
		
		if(octalStr.charAt(0)=='0'){
			octalStr.deleteCharAt(0);
		}
		
		System.out.println(octalStr);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值