十六进制转八进制
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
分析:根据提示我们可以将十六进制数字转换为二进制然后在转换为八进制,我们不使用系统提供的函数(Integer内置函数)来转换因为费内存无法在给定条件内计算出来。我们可以使用StringBuffer函数来保存转换后的函数;可以使用它的.append()方式进行追加,insert()进行插入;下面我们看代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { //赋值的过程 Scanner sc=new Scanner(System.in); int i=sc.nextInt(); String[] arr=new String[i]; for (int j = 0; j < i; j++) { arr[j]=sc.next(); } //转化为二进制 for (int j = 0; j < arr.length; j++) { //存放转换为二进制 StringBuffer s=new StringBuffer(); //对每一位进行判断 for (int k = 0; k < arr[j].length(); k++) { switch(arr[j].charAt(k)) { case '0': s.append("0000"); break; case '1': s.append("0001"); break; case '2': s.append("0010"); break; case '3': s.append("0011"); break; case '4': s.append("0100"); break; case '5': s.append("0101"); break; case '6': s.append("0110"); break; case '7': s.append("0111"); break; case '8': s.append("1000"); break; case '9': s.append("1001"); break; case 'A': s.append("1010"); break; case 'B': s.append("1011"); break; case 'C': s.append("1100"); break; case 'D': s.append("1101"); break; case 'E': s.append("1110"); break; case 'F': s.append("1111"); break; } } //保证正好是3的倍数位,用来转换为八进制 4 2 1 String s1=""; while(s.length()%3!=0) { s=s.insert(0, "0"); } s1=s.toString(); //用来存放转换为八进制后的值 StringBuffer sb=new StringBuffer(); //进行对字符出遍历 for (int k = 0; k < s1.length(); k+=3) { //每三位进行一次判断 //因为转换为二进制只有0或者1所以用这个方法转换八进制 //每三位二进制进行转换八进制 int s2=(s1.charAt(k)-48)*4+(s1.charAt(k+1)-48)*2+(s1.charAt(k+2)-48)*1; //对边界值进行判断 if(k!=0||k==0&&s2!=0) { sb.append(s2); } } //输出字符串 System.out.println(sb); } } }
谢谢大家的三连!