问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
下面附上我的代码:
package a;
import java.util.Scanner;
public class problem10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
String a[]=new String[n];
int b[]=new int[n];
for(int i=0;i<n;i++) {
a[i]=cin.next();
int s = 0,aa=0,k=0;
int wei[]=new int[30];
for(int j=0;j<a[i].length();j++) {
char c=a[i].charAt(j);
if(c>='A'&&c<='F') aa=c-'A'+10;
else aa=c-'0'+0;
s+=aa*Math.pow(16, a[i].length()-1-j);
}
while(s!=0) {
wei[k++]=s%2;
s=s/2;
}
int a1=k/3;
int b1=k%3;
for(int i1=0;i1<a1;i1++) {int c1=(int) (wei[k-1-i1*3]*Math.pow(2, 2)+wei[k-2-i1*3]*Math.pow(2, 1)+wei[k-3-i1*3]*Math.pow(2,0));
b[i]+=c1*Math.pow(10, a1-1-i1);
}
for(int i2=k-1-a1*3;i2>=0;i2--)b[i]+=wei[k-a1*3-1]*Math.pow(2,b1-1-i2);
}
for(int kk=0;kk<n;kk++)System.out.println(b[kk]);
}
}
运行结果如下图所示:
给的提示是先将16进制转化为2进制,再转化为八进制,但是我试了一下感觉这两个过程处理起来以及存储结构都比较麻烦,网上别人的也有帖。我这里采用的思想是先转化为10进制,比如16进制的39,转化为10进制为3*16+9=57;57再转化为2进制,这里是111001,每三个分一组,表示为八进制就为71,这里a1表示每三位二进制的个数,b1表示总位数减去a1*3剩余的位数(一般取1或2),注意运算的时候wei[i](存放二进制每一位的数组)要逆序计算,这里仅将解题思路进行参考,方便以后引用。