文章标题 基础练习 十六进制转八进制

来源:互联网 发布:python try 重试 编辑:程序博客网 时间:2024/06/05 03:48

问题描述
  给定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](存放二进制每一位的数组)要逆序计算,这里仅将解题思路进行参考,方便以后引用。

原创粉丝点击