基础练习 十六进制转八进制

来源:互联网 发布:数据存储单位从小到大 编辑:程序博客网 时间:2024/05/21 19:42


基础练习 十六进制转八进制 
时间限制:1.0s   内存限制:512.0MB
提交此题   锦囊1   锦囊2
问题描述
  给定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 void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  //数据输入
  int n = sc.nextInt();
  String[] sts = new String[n];
  for (int i = 0; i < n; i++) {
   sts[i] = sc.next();
  }
  sc.close();

  for (int i = 0; i < n; i++) {
   //十六进制转换为二进制
   String strBinary = toBinary(sts[i]);
   
   int len_strBin = strBinary.length();
   //增加前导0,因为3位2进制可以转换为一位八进制所有对八取余
   if (len_strBin % 3 == 1)
    strBinary = "00" + strBinary;
   if (len_strBin % 3 == 2)
    strBinary = "0" + strBinary;
   //二进制转为八进制
   String strOctal = toOctal(strBinary);
   //输出
   System.out.println(strOctal);
  }
 }

 //二进制转为八进制
 private static String toOctal(String strBinary) {
  int len = strBinary.length();
  int k;
  StringBuffer stb = new StringBuffer();
  //去掉前导0,因为对应的十六进制不为0也就是:开始四位一定不全为零所以这里最多有一组三个零的情况。
  if (strBinary.substring(0, 3).equals("000"))
   k = 3;
  else
   k = 0;
  for (int i = k; i < len - 2; i += 3) {
   switch (strBinary.substring(i, i + 3)) {
   case "000":
    stb.append("0");
    break;
   case "001":
    stb.append("1");
    break;
   case "010":
    stb.append("2");
    break;
   case "011":
    stb.append("3");
    break;
   case "100":
    stb.append("4");
    break;
   case "101":
    stb.append("5");
    break;
   case "110":
    stb.append("6");
    break;
   case "111":
    stb.append("7");
    break;
   default:
    break;
   }
  }
  return stb.toString();
 }
 
 //十六进制转为二进制函数
 private static String toBinary(String strHex) {
  int len_str = strHex.length();
  StringBuffer stb = new StringBuffer();
  for (int i = 0; i < len_str; i++) {
   switch (strHex.charAt(i)) {
   case '0':
    stb.append("0000");
    break;
   case '1':
    stb.append("0001");
    break;
   case '2':
    stb.append("0010");
    break;
   case '3':
    stb.append("0011");
    break;
   case '4':
    stb.append("0100");
    break;
   case '5':
    stb.append("0101");
    break;
   case '6':
    stb.append("0110");
    break;
   case '7':
    stb.append("0111");
    break;
   case '8':
    stb.append("1000");
    break;
   case '9':
    stb.append("1001");
    break;
   case 'A':
    stb.append("1010");
    break;
   case 'B':
    stb.append("1011");
    break;
   case 'C':
    stb.append("1100");
    break;
   case 'D':
    stb.append("1101");
    break;
   case 'E':
    stb.append("1110");
    break;
   case 'F':
    stb.append("1111");
    break;
   default:
    break;
   }
  }
  return stb.toString();
 }
}

1 0
原创粉丝点击