java编程题八进制_基础练习-十六进制转八进制

问题描述

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

输入格式

输入的第一行为一个正整数n (1<=n<=10)。

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

输出格式

输出n行,每行为输入对应的八进制正整数。

【注意】

输入的十六进制数不会有前导0,比如012A。

输出的八进制数也不能有前导0。

样例输入

2

39

123ABC

样例输出

71

4435274

解题思路:

需要先将十六进制转换成二进制,然后再将二进制转换成八进制,其中一位十六进制可以转换成四位二进制,三位二进制可以转换为一位八进制

要注意进制转换后0、1的排序问题

因为十六进制的最大长度为100001,所以转换后的八进制考虑使用数组接收

存在大数问题,一定要考虑内存空间的问题

代码实现:

#include

#include

#define MAXSIZE 100001

typedef struct {

char data[MAXSIZE];

} Node;

void convert(Node node);

int main (void) {

int time, i;

scanf("%d", &time);

Node number[time + 1];

for (i = 1; i <= time; i++) {

scanf("%s", &number[i].data);

}

for (i = 1; i <= time; i++) {

convert(number[i]);

printf("\n");

}

return 0;

}

void convert(Node node) {

int i = 0, middle = 0, value = 0, array[4 * strlen(node.data)], j = 0, counter = 0, mildderAr[4];

while (node.data[i] != '\0') {

value = (int) node.data[i];

/*输入的值为A-F*/

if ( value > 64) {

middle = value - 55;

} else if (value > 47) { /*输入的值为0-9*/

middle = value - 48;

}

/*将16进制转换为二进制,如 8 ---> 0001*/

for (j = 0; j <= 3; j++) {

mildderAr[j] = middle % 2;

middle /= 2;

}

/*将上面得到的二进制数组逆置,即 8 ---> 1000,补充到array数组中*/

while (j > 0) {

array[counter] = mildderAr[j - 1];

counter++;

j--;

}

i++;

}

int sum[i * 3], count = 0;

for (j = counter - 1; j >= 0; j -= 3) {

if (j > 1) {

sum[count] = array[j] + array[j - 1] * 2 + array[j - 2] * 4;

} else {

sum[count] = array[j] + array[j - 1] * 2;

}

count++;

}

for (i = count - 1; i >=0; i-- ) {

if (i == count - 1 && sum[i] == 0) {

continue;

}

printf("%d", sum[i]);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是Java算法实现十进制转换为二进制、八进制和十六进制的代码示例: ```java public class NumberConversion { public static void main(String[] args) { int decimalNumber = 345; // 要转换的十进制数 String binaryNumber = decimalToBinary(decimalNumber); String octalNumber = decimalToOctal(decimalNumber); String hexadecimalNumber = decimalToHexadecimal(decimalNumber); System.out.println("二进制数为:" + binaryNumber); System.out.println("八进制数为:" + octalNumber); System.out.println("十六进制数为:" + hexadecimalNumber); } // 十进制转二进制 public static String decimalToBinary(int decimalNumber) { return Integer.toBinaryString(decimalNumber); } // 十进制转八进制 public static String decimalToOctal(int decimalNumber) { return Integer.toOctalString(decimalNumber); } // 十进制转十六进制 public static String decimalToHexadecimal(int decimalNumber) { return Integer.toHexString(decimalNumber); } } ``` 运行结果: ``` 二进制数为:101011001 八进制数为:531 十六进制数为:159 ``` 以上代码中的三个转换方法都是使用Java内置的方法来实现,分别是`Integer.toBinaryString()`、`Integer.toOctalString()`和`Integer.toHexString()`。如果需要手动实现这些转换算法,可以参考以下示例代码: ```java public class NumberConversion { public static void main(String[] args) { int decimalNumber = 345; // 要转换的十进制数 String binaryNumber = decimalToBinary(decimalNumber); String octalNumber = decimalToOctal(decimalNumber); String hexadecimalNumber = decimalToHexadecimal(decimalNumber); System.out.println("二进制数为:" + binaryNumber); System.out.println("八进制数为:" + octalNumber); System.out.println("十六进制数为:" + hexadecimalNumber); } // 十进制转二进制 public static String decimalToBinary(int decimalNumber) { StringBuilder binaryNumber = new StringBuilder(); while (decimalNumber > 0) { binaryNumber.insert(0, decimalNumber % 2); decimalNumber /= 2; } return binaryNumber.toString(); } // 十进制转八进制 public static String decimalToOctal(int decimalNumber) { StringBuilder octalNumber = new StringBuilder(); while (decimalNumber > 0) { octalNumber.insert(0, decimalNumber % 8); decimalNumber /= 8; } return octalNumber.toString(); } // 十进制转十六进制 public static String decimalToHexadecimal(int decimalNumber) { StringBuilder hexadecimalNumber = new StringBuilder(); while (decimalNumber > 0) { int remainder = decimalNumber % 16; if (remainder < 10) { hexadecimalNumber.insert(0, remainder); } else { hexadecimalNumber.insert(0, (char) ('A' + remainder - 10)); } decimalNumber /= 16; } return hexadecimalNumber.toString(); } } ``` 以上代码中的三个转换方法都是使用基本算法来实现的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值