挑战面试编程:十六进制数转化为八进制数

挑战面试编程:十六进制数转化为八进制数

题目:

问题描述

  给定n个十六进制正整数,输出它们对应的八进制数。输入格式  输入的第一行为一个正整数n(1<=n<=10)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式  输出n行,每行为输入对应的八进制正整数。注意  输入的十六进制数不会有前导0,比如012A。  输出的八进制数也不能有前导0。样例输入239123ABC样例输出714435274提示  先将十六进制数转换成某进制数,再由某进制数转换成八进制。*/

想法:先把16进制数转为2进制数,再把2进制数转为8进制数。

代码:

#include <stdio.h>#include <string.h>/*给定n个十六进制正整数,输出它们对应的八进制数。*/char *table1[16] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111","1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" };char *table2[8] = { "000", "001", "010", "011", "100", "101", "110", "111" };//转二进制,一位转四位void toBinary(char **nums, int n){int len, i, j, k, pos;for (i = 0; i < n; i++){len = strlen(nums[i]);j = 399998;for (k = len – 1; k >= 0; k–){if (nums[i][k] >= 'A' && nums[i][k] <= 'F')pos = nums[i][k] – 'A' + 10;elsepos = nums[i][k] – '0';strncpy(nums[i] + j, table1[pos], 4);j -= 4;}j += 4;memset(nums[i], '0', j);}}//转八进制,三位转一位void toOctal(char **nums, int n){int i, j, k, r, s;for (i = 0; i < n; i++){j = 0;k = 399999;while (nums[i][j] == '0')j++;s = 400001;while (k >= j – 3){for (r = 0; r < 8; r++){if (strncmp(nums[i] + k, table2[r], 3) == 0){nums[i][s–] = r + '0';break;}}k -= 3;}s++;while (nums[i][s] == '0')s++;//打印puts(nums[i] + s);}}int main(void) //14{//读入数据int n;scanf("%d", &n);char **nums = malloc(sizeof(char*)*n);int i;for (i = 0; i < n; i++){nums[i] = malloc(sizeof(char) * 400003);memset(nums[i], 0, 400003);scanf("%s", nums[i]);}//先转二进制toBinary(nums, n);//再转八进制toOctal(nums, n);//释放内存for (i = 0; i < n; i++)free(nums[i]);free(nums);return 0;}运行

代码下载:十六进制数转化为八进制数

所有内容的目录

CCPP Blog 目录

大理的洱海形如人耳,风平浪静时,

挑战面试编程:十六进制数转化为八进制数

相关文章:

你感兴趣的文章:

标签云: