16进制转化为8进制

来源:互联网 发布:淘宝限制购买怎么解决 编辑:程序博客网 时间:2024/05/16 08:58
package lan11;/* 问题描述 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式 输出n行,每行为输入对应的八进制正整数。 注意 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。 样例输入 2 39 123ABC 样例输出 71 4435274 提示 先将十六进制数转换成某进制数,再由某进制数转换成八进制。*/import java.util.*;public class Main3 {public static String[] str;public static int n;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();str = new String[n];char[] tmp;for (int i = 0; i < n; i++) {str[i] = sc.next();}for (int i = 0; i < n; i++) {tmp = str[i].toCharArray();seight(tmp);}}public static void seight(char[] tmp) {// 转成二进制int[][] tms = new int[tmp.length][4];int a;// 转化为二进制for (int i = tmp.length - 1; i >= 0; i--) {// 转化为数字if (tmp[i] >= 'A') {a = tmp[i] - 55;} else {a = tmp[i] - '0';}int sdtmp = a;// 转化为二进制for (int j = 3; j >= 0; j--) {tms[i][j] = sdtmp % 2;sdtmp /= 2;}}int sumsd = tmp.length * 4;while (sumsd % 3 != 0) {sumsd++;}// 建立保存二进制的数组,可以化为八进制int[] tsms = new int[sumsd];int index = 0;for (int i = tms.length - 1; i >= 0; i--) {for (int j = 3; j >= 0; j--) {tsms[index++] = tms[i][j];}}// 化为八进制int[] bastms = new int[sumsd / 3];// 保存三位的一个数字int[] sude = new int[3];// 保存三个二进制的下标int indesd = 0, ind = 0;for (int i = 1; i <= tsms.length; i++) {sude[indesd % 3] = tsms[i - 1];// 转化为8进制for (int j = (i - 1) % 3; j > 0; j--) {sude[indesd % 3] *= 2;}indesd++;// 保存八进制if (i % 3 == 0) {bastms[ind++] = sude[0] + sude[1] + sude[2];sude[0] = sude[1] = sude[2] = 0;}}// 输出八进制// 去除前导0int sling = 0;for (int i = bastms.length - 1; i >= 0; i--) {if (bastms[i] == 0) {// 当遇到前导0时,则标记sling加加sling++;} else { // 否则直接跳出循环break;}}if (sling == bastms.length) {System.out.print(0);return;}// 打印for (int i = bastms.length - 1 - sling; i >= 0; i--) {System.out.print(bastms[i]);}System.out.println();}}

0 0
原创粉丝点击