关闭

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

标签: java数据结构算法蓝桥杯
51人阅读 评论(0) 收藏 举报
分类:
问题描述
  给定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);
	}
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9596次
    • 积分:1483
    • 等级:
    • 排名:千里之外
    • 原创:145篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条