首页 > 编程 > Java > 正文

java 16进制转换8进制

2019-11-06 08:01:59
字体:
来源:转载
供稿:网友

1.问题描述

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

2.输入格式

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

3.输出格式

     输出n行,每行为输入对应的八进制正整数。     注意:   输入的十六进制数不会有前导0,比如012A。   输出的八进制数也不能有前导0。

4.解题思路

    从进制转换基础,进制转换可知,可以将16进制转换为2进制,再由2进制进行转化8进制,至于为什么这样做呢,因为16进制每一个位子上的数字都可以变成4位的2进制数,而每3个二进制数又可以组成8进制上对应位子的数字。

5.java代码
public class Test{	public static void main(String[] args)	{		Scanner scanner=new Scanner(System.in);		int n=scanner.nextInt();		if (n>=1||n<=10)		{			String strings[]=new String[n];			for (int i = 0; i < n; i++)			{				strings[i]=scanner.next();			}			//使用for each类型的循环			for (String str : strings)			{				//调用transform16To8()静态方法				transform16To8(str);			}		}else {			scanner.close();			return;		}			}	PRivate static void transform16To8(String str)	{		//初始化StringBuffer类的sb对象,但是这样的 对象是一个空		StringBuffer sb=new StringBuffer();		//for循环		for (int i = 0; i < str.length(); i++)		{			// 把16进制数的每一位转换成四位2进制数字			String string=transform16To2(str.charAt(i));			sb.append(string);		}		//将转换成2进制的数字放入java栈中		Stack<String> stack=new Stack<>();		//最后 i -= 3;这句的意思就是i = i - 3		for (int i = sb.length(); i >=0; i-=3)		{			int start= i-3 >=0 ? i-3 : 0;			//截取字符串			String temp=sb.substring(start,i);			// 从后向前每三位2进制数字转换成一位8进制数字,存储在栈中。			stack.add(transform12To8(temp));		}		//判断栈顶是否有0        while (stack.peek().equals("0")) {         	// 删除前面的多余的0            stack.pop();          }          while (!stack.isEmpty()) {              System.out.print(stack.pop());          }          System.out.println();  			}	private static String transform12To8(String str)	{		    int result = 0;  	        for (int i = 0; i < str.length(); i++) {  	            result += Math.pow(2, str.length() - 1 - i) * (str.charAt(i) - '0');	        }  	        return result + "";  	}	private static String transform16To2(char c)	{				int temp=c>='A'?c - 'A' + 10 : c - '0';		int[] a=new int[4];		int i = 0;		for (; i < a.length; i++)		{			//取temp的余数			a[i]=temp%2;			temp /= 2;  		}		i--;		StringBuffer sb =new StringBuffer();		//逆序排列		for (; i>=0; i--)		{			sb.append(a[i]);		}		return sb.toString();	}	}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表