(Java)【基础练习】10-12:十进制转十六进制 + 十六进制转十进制 + 十六进制转八进制

10:十进制转十六进制

问题描述:

  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
  给出一个非负整数,将它表示成十六进制的形式。

输入格式:输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647

输出格式:输出这个整数的16进制表示

样例输入:

        30

样例输出

        1E

----------------------------------------------------

思路:

       十进制转换为k进制可采用除k取余法。

       需要注意的是:这里越早得到的数字其数位越低,因此应对得到的字符串进行倒置处理。

代码示例:

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		long n = in.nextLong();
		in.close();
		
        // 用数组保存十六进制下0-15相应的字符
		char[] a = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
		
		StringBuilder s = new StringBuilder();
		
		if (n == 0)
			s.append("0");
		
		while (n != 0) {
			s.append(a[(int)n%16]);
			n /= 16;
		}
		s.reverse();
		System.out.println(s);
	}
}

 

11:十六进制转十进制

问题描述:

  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

样例输入:

        FFFF

样例输出:

        65535

--------------------------------------------------------------------------------------------------

思路:

        k进制转换为十进制,即求 当前位数字 * 进制基数 * 数位权重 之和。

       例如:1E = E(14)*16^0 + 1*16^1 = 14 + 16 = 30

代码示例:

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		StringBuilder s = new StringBuilder(in.nextLine());
		in.close();
		
		long rel = 0;
		s.reverse();
		for (int i=0; i<s.length(); i++) {
			char c = s.charAt(i);
			int temp = c-'0';
			
            // 用来判断这一位的字符是0-9还是A-F('A'-'0'=17)
			if (temp < 16) {
				rel += temp * Math.pow(16, i);
			}
			else {
				rel += (temp-7) * Math.pow(16, i);
			}
		}
		
		System.out.println(rel);
	}
}

 

12:十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

---------------------------------------------------------------------------------

思路:
  先将十六进制数转换成二制数,再由二进制数转换成八进制。

       需要注意的是:每1位十六进制数可以转换为4位二进制数,而3位二进制数可以转换为1位八进制数。

代码示例:

import java.util.*;

public class Main{
    // 将十六进制转换为二进制
	private static StringBuilder toBinary(String strHex) {  
        StringBuilder strBin = new StringBuilder();
        
        for (int i=0; i<strHex.length(); i++){
        	char c = strHex.charAt(i);
            switch (c) {
                case '0':
                	strBin.append("0000");
                	break;
                case '1':
                	strBin.append("0001");
                	break;
                case '2':
                	strBin.append("0010");
                	break;
                case '3':
                	strBin.append("0011");
                	break;
                case '4':
                	strBin.append("0100");
                	break;
                case '5':
                	strBin.append("0101");
                	break;
                case '6':
                	strBin.append("0110");
                	break;
                case '7':
                	strBin.append("0111");
                	break;
                case '8':
                	strBin.append("1000");
                	break;
                case '9':
                	strBin.append("1001");
                	break;
                case 'A':
                	strBin.append("1010");
                	break;
                case 'B':
                	strBin.append("1011");
                	break;
                case 'C':
                	strBin.append("1100");
                	break;
                case 'D':
                	strBin.append("1101");
                	break;
                case 'E':
                	strBin.append("1110");
                	break;
                case 'F':
                	strBin.append("1111");
                	break;
                default:
                	break;
            }
        }
        return strBin;
    }
	
    // 将二进制转换为八进制
	private static StringBuilder toOctal(StringBuilder strBin) {
        StringBuilder strOct = new StringBuilder();
        
        for (int i=0; i<strBin.length(); i+=3) {
        	String temp = strBin.substring(i, i+3);
        	
            switch (temp) {
                case "000":
                	strOct.append("0");
                	break;
                case "001":
                	strOct.append("1");
                	break;
                case "010":
                	strOct.append("2");
                	break;
                case "011":
                	strOct.append("3");
                	break;
                case "100":
                	strOct.append("4");
                	break;
                case "101":
                	strOct.append("5");
                	break;
                case "110":
                	strOct.append("6");
                	break;
                case "111":
                	strOct.append("7");
                	break;
                default:
                	break;
            }
        }
        return strOct;
    }
	
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        
        String[] strHex = new String[n];
        for (int i=0; i<n; i++) {
            strHex[i] = in.next();
        }
        in.close();
        
        for (int i=0;i<n;i++) {
            StringBuilder strBin = toBinary(strHex[i]);
            int l = strBin.length();
            
            // 不足三位时用零补足
            if (l%3 == 1) {
            	strBin.insert(0, "00");
            }
            if (l%3 == 2) {
            	strBin.insert(0, "0");
            }
            
            StringBuilder strOct = toOctal(strBin);
            // 去掉前导位的0
            if (strOct.charAt(0) == '0') {
            	
            	strOct.deleteCharAt(0);
            }
            System.out.println(strOct);
        }
    }
}

 

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页